Python - 函数

时间:2017-04-06 12:52:22

标签: python

我正在经历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文档中理解的内容:

  1. 在定义范围内的函数定义点评估默认值。所以,L = [4,5]

  2. 第一次调用f()后,L = [6,7,1]。这很好。

  3. 第二次调用f()后输出的内容不明白。如果对f()的调用之间共享L's值,则第二次函数调用后的输出应为[6,7,1,2]。 L's的价值是在第二次和第三次调用f()之间共享,但不是在第一次和第二次调用之间。

2 个答案:

答案 0 :(得分:0)

这是因为每次拨打f时都会执行L=x,因为xL参数列表中f的默认值。

所以每次它实际附加到x

答案 1 :(得分:0)

并非共享L的值,而是共享创建函数时定义的L默认值。在这种情况下,该列表以[4, 5]开头。

如果您在拨打L时为f指定了不同的值(就像您在第一次通话中所做的那样),那么这就是使用的内容,并且不与其他来电共享。

如果您没有为L指定任何值,那么它会使用默认值(正如您所期望的那样),这是默认值。

无论如何,如果它不清楚,不要使用可变的默认值。如果您想要一些可以使用可变默认值方便地完成的行为,请手动执行。即使代码稍长,它也会更加明确,可预测和可读。