Python递归函数未初始化默认参数值

1 投票
1 回答
2785 浏览
提问于 2025-04-17 18:20

我有一个辅助函数,目的是打印出一个二叉树(无序)的内部节点和叶子节点。我不打算提供代码,因为我正在上课,但我可以告诉你,我已经写好了这个函数,并且它在我第一次传入节点时是有效的:

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 = []
    ...

撰写回答