这个问题在这里已有答案:
以下代码
def f(x,l=[]):
for i in range(x):
l.append(i*i)
print(l)
f(2)
f(3)
输出
[0, 1]
[0, 1, 0, 1, 4]
而不是琐碎的
[0, 1]
[0, 1, 4]
这意味着命名参数l
实际上是一个单一的一致变量,它不会对f
的新调用重置。
这显然不是一个bug,而是设计的。
我的问题是为什么这是理想的行为?对我而言似乎更有困惑而不是有用,这将使我永远不想使用不可变的默认值。
函数定义一次,因此当使用具有可变类型的默认args时,它们使用对该默认arg的单个引用(因为它再次定义一次)。这就是为什么使用列表,dicts等作为默认args而不是像None,int,str等不可变类型的错误做法。
举个例子:
def mutable_arg(x=[]):
x.append(3)
print(x)
def immutable_arg(x=None):
x = x or []
x.append(3)
print(x)
mutable_arg() # prints [3]
mutable_arg() # prints [3,3]
immutable_arg() # prints [3]
immutable_arg() # prints [3]
在immutable_arg
中,它为每个调用创建一个新列表,而不是重新使用与mutable_arg
相同的默认值