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

时间:2013-03-08 00:24:43

标签: 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。有人能解释一下这里发生了什么吗?我必须在不重新启动shell的情况下针对不同情况测试我的函数。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

当遇到函数定义时,即在Python看到def行时,会计算的默认参数。然后它们绑定到函数本身。

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

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

def foo(bar=None):
    if bar is None:
        bar = []
    ...