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用作默认参数值,因为它是。。。可变。不要使用可变作为默认参数值,因为它是。。。易变的。