python递归函数不初始化默认参数值

0 python

所以我有一个辅助函数,它应该打印出二叉树(未排序)的内部节点和叶子。因为我在上课,所以我不会提供代码,但我可以告诉你,我已经对它进行了编码,它适用于我在那里投入的第一个节点:

def helper(root, internals=[], leaves=[]):
    #function code here...
>>> helper(node)
    ([13, 14, 27], [10, 11, 12, 17, 19])
Run Code Online (Sandbox Code Playgroud)

据我所知,这是正确的输出。但是,当我在另一个节点上再次调用相同的函数时,输出被覆盖到前一个:

>>> helper(pen)
    ([13, 14, 27, 6, 8, 14], [10, 11, 12, 17, 19, 2, 4, 10, 12])
Run Code Online (Sandbox Code Playgroud)

这是不正确的,因为树pen没有元素 13、14、27 或 10、11、12、17、19。有人可以解释这里发生了什么吗?我必须针对不同情况测试我的函数,而无需每次都重新启动 shell。我该如何解决?

nne*_*neo 7

当遇到函数定义时,即当 Python 看到该def行时,将评估默认参数。然后它们被绑定到函数本身。

使用可变默认参数,绑定到函数的默认参数可能会改变,这会导致一些相当令人惊讶的结果。

通常的建议:None用作默认值,并根据需要创建实际默认值:

def foo(bar=None):
    if bar is None:
        bar = []
    ...
Run Code Online (Sandbox Code Playgroud)