我不知道 f()
和 g()
有什么区别。
在函数 f
中,每当函数被调用时,列表 L 都会被累积。
但在函数 g
中,它不会..
def f(a, L=[]):
L.append([2]);
print(L);
def g(a, L=[]):
L = L+[2];
print(L);
print("f:")
f(1) # [[2]]
f(2) # [[2], [2]]
f(3) # [[2], [2], [2]]
print("g:")
g(1) # [2]
g(2) # [2]
g(3) # [2]
您在示例中看到的奇怪行为不是由于 + 运算符和追加函数之间的差异所致。
这是因为您将一个列表作为默认值分配给函数参数,并将连接的结果分配给 g
中的局部变量。
这不是广为人知,但将列表(或字典或对象)定义为参数默认值可能不是您想要的。当您这样做时,用作参数默认值的列表将在所有函数调用之间共享。
所以对于 f
函数:
- 您第一次调用它时没有使用
L
参数,将采用默认值 ([]
) 并附加 2
。所以它变成了[2]
- 您第二次调用它时没有使用
L
参数,将采用默认值,但现在是 [2]
。 2
再次附加,它变成 [2, 2]
现在是您函数的默认值。
对于 g
函数:
- 至于
f
函数,默认值是一个空列表,但这个列表永远不会被修改。实际上 L + [2]
的结果会影响到局部变量 L
并且函数的默认值保持不变。所以当你再次调用该函数时,默认值总是[]
。
- 作为Klimenkomud said in his answer使用
+=
运算符而不是连接和赋值实际上修改了 L
参数的默认值。如果这样做,g
函数的行为将类似于 f
函数。
总而言之,使用空列表作为参数默认值几乎不是您想要的。相反,您可能想要这样:
def f(a, L=None):
L = L or []
...