Python递归函数未初始化默认参数值
我有一个辅助函数,目的是打印出一个二叉树(无序)的内部节点和叶子节点。我不打算提供代码,因为我正在上课,但我可以告诉你,我已经写好了这个函数,并且它在我第一次传入节点时是有效的:
def helper(root, internals=[], leaves=[]):
#function code here...
>>> helper(node)
([13, 14, 27], [10, 11, 12, 17, 19])
根据我的理解,输出是正确的。然而,当我再次用另一个节点调用同样的函数时,输出却覆盖了之前的结果:
>>> helper(pen)
([13, 14, 27, 6, 8, 14], [10, 11, 12, 17, 19, 2, 4, 10, 12])
这是不对的,因为这个树pen
并不包含元素13、14、27或10、11、12、17、19。有人能解释一下这是怎么回事吗?我需要在不每次都重启环境的情况下测试我的函数,怎么才能解决这个问题呢?
1 个回答
9
默认参数是在你定义函数的时候被计算的,也就是说,当Python看到def
这一行时,它就会处理这些默认参数。然后,这些参数就和这个函数绑定在一起了。
对于可变的默认参数来说,绑定到函数上的默认参数可能会被改变,这就会导致一些意想不到的结果。
通常的建议是:使用None
作为默认值,然后在需要的时候再创建实际的默认值:
def foo(bar=None):
if bar is None:
bar = []
...