[英]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]
你可以看到L
的id
每次变化。
但是当你使用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.