Tôi đã viết một đoạn mã nhỏ mà tính độ dài đường đi của một nút cho trước (ví dụ như khoảng cách của nó tới nút gốc):Python: Hành vi kỳ lạ của hàm đệ quy với đối số từ khóa
def node_depth(node, depth=0, colored_nodes=set()):
"""
Return the length of the path in the parse tree from C{node}'s position
up to the root node. Effectively tests if C{node} is inside a circle
and, if so, returns -1.
"""
if node.mother is None:
return depth
mother = node.mother
if mother.id in colored_nodes:
return -1
colored_nodes.add(node.id)
return node_depth(mother, depth + 1, colored_nodes)
Bây giờ có một điều kỳ lạ xảy ra với hàm đó (ít nhất nó lạ với tôi): Gọi node_depth lần đầu tiên trả về giá trị đúng. Tuy nhiên, gọi nó lần thứ hai với cùng một nút trả về -1. Các colored_nodes thiết rỗng trong cuộc gọi đầu tiên, nhưng có chứa tất cả các node-ID trong cuộc gọi thứ hai đã được thêm vào trong một đầu tiên:
print node_depth(node) # --> 9
# initially colored nodes --> set([])
print node_depth(node) # --> -1
# initially colored nodes --> set([1, 2, 3, 38, 39, 21, 22, 23, 24])
print node_depth(node, colored_nodes=set()) # --> 9
print node_depth(node, colored_nodes=set()) # --> 9
Tôi có thiếu một số điều Python cụ thể ở đây và điều này thực sự là phải theo cách đó?
Cảm ơn trước,
Jena
Điều tương tự cũng làm tôi khó chịu và tôi đã tìm thấy câu hỏi của bạn và một giải thích chi tiết khác về SO. http://stackoverflow.com/questions/1132941/least-astonishment-in-python-which-scope-is-the-mutable-default-argument-in – Yefei