我是Python的初学者。在浏览官方介绍https://docs.python.org/2/tutorial/controlflow.html时,我不太了解4.7.1节中的最后一个示例。具体来说,为什么
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
在不显式提供L
的默认值的情况下评估函数时是否在后续调用之间共享值?
假设我连续评估f(1)
和f(2)
。对于第一次调用,L
设置为默认值None
,因此满足if
循环条件,并且L
设置为[]
。然后将L
修改为[1]
并作为输出返回。在第二个调用中,L
仍然是[1]
*,而不是None
,因此不应该启动if
循环,我希望输出只是2
附加到[1]
,即[1,2]
,而输出为[2]
。
因此*必须为假。但是当我评估print(f(1))
时,我得到[1]
作为输出,而不是None
。在同一部分中倒数第二个例子使我的困惑更加复杂:
def f(a, L=[]):
L.append(a)
return L
print f(1)
print f(2)
print f(3)
返回
[1]
[1, 2]
[1, 2, 3]
这是怎么回事?该网站确实说默认值仅被评估一次,那么是否仅在默认值设置为可变对象时才保留该值,就像上面的[]
一样?如果是这样的话,我认为在第一个示例中None
是不可变的,并且返回的L
的值在执行和显示输出后立即被丢弃。