函数的默认值未在调用之间共享

时间:2019-06-27 09:41:18

标签: python

我是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的值在执行和显示输出后立即被丢弃。

0 个答案:

没有答案