Python 递归函数不刷新循环内的列表
我有以下课程:Python 递归函数不刷新循环内的列表,python,python-3.x,recursion,Python,Python 3.x,Recursion,我有以下课程: class Node: def __init__(self, id, parent): self.id = id self.parent = parent 节点类的某些对象: n0 = Node(0, None) n1 = Node(1, n0) n2 = Node(2, n1) n3 = Node(3, n2) 以及一个递归函数,用于获取层次结构树: def get_hierarchy(node, hierarchy_list=[]): parent =
class Node:
def __init__(self, id, parent):
self.id = id
self.parent = parent
节点类的某些对象:
n0 = Node(0, None)
n1 = Node(1, n0)
n2 = Node(2, n1)
n3 = Node(3, n2)
以及一个递归函数,用于获取层次结构树:
def get_hierarchy(node, hierarchy_list=[]):
parent = node.parent
if parent:
hierarchy_list.append(parent)
return get_hierarchy(parent, hierarchy_list)
else:
return ', '.join(str(node.id) for node in reversed(hierarchy_list))
如果我在循环外调用该函数,它将按预期工作:
hierarchy = get_hierarchy(n3)
print(hierarchy)
# 0, 1, 2
for i in range(5):
nodes = [n0, n1, n2]
hierarchy = get_hierarchy(n3, []) # forcing to be empty
print(hierarchy)
# 0, 1, 2
# 0, 1, 2
# 0, 1, 2
# 0, 1, 2
# 0, 1, 2
但是如果我在循环内调用该函数,则不会在每个循环上刷新层次结构\u列表
变量:
for i in range(5):
nodes = [n0, n1, n2]
hierarchy = get_hierarchy(n3)
print(hierarchy)
# 0, 1, 2
# 0, 1, 2, 0, 1, 2
# 0, 1, 2, 0, 1, 2, 0, 1, 2
# 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2
# 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2
如果我在每次交互时强制层次结构\u列表
为空,它将按预期工作:
hierarchy = get_hierarchy(n3)
print(hierarchy)
# 0, 1, 2
for i in range(5):
nodes = [n0, n1, n2]
hierarchy = get_hierarchy(n3, []) # forcing to be empty
print(hierarchy)
# 0, 1, 2
# 0, 1, 2
# 0, 1, 2
# 0, 1, 2
# 0, 1, 2
为什么python在每次交互时都不刷新
层次结构列表
,因为我在get\u层次结构
的作用域之外调用了get\u层次结构
函数,如果我强制它成为一个新的列表,它就会工作。这种行为的原因是什么?我认为原因是在函数中使用可变参数作为默认值,这是一个坏主意。定义函数时,列表仅启动一次,而不是每次调用函数时重新启动
每次调用该函数时,函数参数的默认值都指向相同的列表,因此append
方法会不断添加到相同的列表中。当您强制它为空列表时,参数指向一个新的空列表,以避免您遇到的问题
看看同样的解释。我认为原因是您在函数中使用可变参数作为默认值,这是一个坏主意。定义函数时,列表仅启动一次,而不是每次调用函数时重新启动 每次调用该函数时,函数参数的默认值都指向相同的列表,因此
append
方法会不断添加到相同的列表中。当您强制它为空列表时,参数指向一个新的空列表,以避免您遇到的问题
查看相同的解释。不要将mutable用作默认参数值,因为它是。。。可变。不要使用可变作为默认参数值,因为它是。。。易变的。