繁体   English   中英

具有可变默认值的函数

[英]Functions with mutable default values

我对python对默认函数参数的评估感到困惑。 如文档中所述( https://docs.python.org/3.6/tutorial/controlflow.html#more-on-defining-functions

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

print(f(1))
print(f(2))
print(f(3))

结果是

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

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

print(f(1))
print(f(2))
print(f(3))

结果是

[1]
[2] 
[3]

如果L仅被评估一次,那么该函数是否应该返回相同的结果? 有人可以解释我在这里错过了什么吗?

这个问题不同于“最小惊讶”和可变默认论证 这个问题质疑设计选择,而我在这里试图了解具体案例。

你不是在追加,而是在这里创建一个新的L

>>> def f(a, L=[]):
    L = L+[a] #Here you're making a new list with the default argument and a.
    print(id(L))
    return L
>>> f(1)
140489350175624
[1]
>>> f(1)
140489349715976
[1]
>>> f(2)
140489349718536
[2]

你可以看到Lid每次变化。

但是当你使用append它会:

>>> def f(a, L=[]):
    L.append(a) #Here you're just appending and NOT making a new list.
    print(id(L))
    return L
>>> f(1)
140489350175624
[1]
>>> f(12)
140489350175624
[1, 12]
>>> f(3)
140489350175624
[1, 12, 3]
>>> 

这个

L.append(a)

您将在所有函数调用中追加相同的列表对象,因为列表是可变的。

而在:

L = L+[a]

你实际上是将名字L 重新绑定L[a]的串联。 然后,名称L变为函数的本地。 因此,在重新绑定后,每个函数调用L变得不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM