函数参数中一个空列表的值,例如这里

可能重复:
Python中的“最小惊讶”:可变的默认参数

def f(a, L=[]):
    L.append(a)
    return L

print(f(1, [1, 2]))
print(f(1))
print(f(2))
print(f(3))

我想知道为什么其他f(1),f(2),f(3)没有附加到第一个f(1,[1,2])。 我想结果应该是:

[1, 2, 1]
[1, 2, 1, 1]
[1, 2, 1, 1, 2]
[1, 2, 1, 1, 2, 3]

但结果不是这样。 我不知道为什么。


有两个不同的问题(更好地称为概念)融合成一个问题陈述。

第一个与agh指出的SO问题有关。 这个线程给出了详细的解释,除了为了这个线程的缘故,我再次解释它是没有意义的,我可以特权说,函数是第一类对象,并且参数和它们的默认值在声明期间是有界的。 所以参数的作用与函数的静态参数非常相似(如果在不支持头等功能对象的其他语言中可以做到这一点)。

第二个问题是参数L绑定到什么List对象。 在传递参数时,传递的List参数是L绑定的内容。 当没有任何参数的情况下被调用时,它更像是绑定一个不同的列表(作为默认参数提到的那个列表),这个列表与第一次调用时传递的不同。 为了让案例更加突出,只需按照以下方式更改您的功能并运行样本。

>>> def f(a, L=[]):
        L.append(a)
        print id(L)
        return L

>>> print(f(1, [1, 2]))
56512064
[1, 2, 1]
>>> print(f(1))
51251080
[1]
>>> print(f(2))
51251080
[1, 2]
>>> print(f(3))
51251080
[1, 2, 3]
>>> 

正如你所看到的,第一次调用打印出与后续调用不同的参数L的不同ID。 因此,如果列表不同,那么行为和值将被追加。 希望现在它应该是有道理的


为什么你等待的结果,如果你调用函数初始化空列表,如果你不通过第二个参数?

对于你想要的结果,你应该使用闭包或全局变量。

链接地址: http://www.djcxy.com/p/28535.html

上一篇: The value of an empty list in function parameter, example here

下一篇: Python base classes share attributes?