我正在经历https://docs.python.org/3.5/tutorial/controlflow.html#default-argument-values。我在那里稍微修改了一下这个例子:
x = [4,5]
def f(a, L=x):
L.append(a)
return L
x = [8,9]
print(f(1,[6,7]))
print(f(2))
print(f(3))
我得到的输出是:
[6, 7, 1]
[4, 5, 2]
[4, 5, 2, 3]
现在,根据我从Python文档中理解的内容:
在定义范围内的函数定义点评估默认值。所以,L = [4,5]
第一次调用f()后,L = [6,7,1]。这很好。
第二次调用f()后输出的内容不明白。如果对f()的调用之间共享L's值,则第二次函数调用后的输出应为[6,7,1,2]。 L's的价值是在第二次和第三次调用f()之间共享,但不是在第一次和第二次调用之间。
答案 0 :(得分:0)
这是因为每次拨打f
时都会执行L=x
,因为x
是L
参数列表中f
的默认值。
所以每次它实际附加到x
。
答案 1 :(得分:0)
并非共享L
的值,而是共享创建函数时定义的L
的默认值。在这种情况下,该列表以[4, 5]
开头。
如果您在拨打L
时为f
指定了不同的值(就像您在第一次通话中所做的那样),那么这就是使用的内容,并且不与其他来电共享。
如果您没有为L
指定任何值,那么它会使用默认值(正如您所期望的那样),这是默认值。
无论如何,如果它不清楚,不要使用可变的默认值。如果您想要一些可以使用可变默认值方便地完成的行为,请手动执行。即使代码稍长,它也会更加明确,可预测和可读。