python中"append"和"+"的区别是什么?

hs *_*s p 9 python

我不知道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]
Run Code Online (Sandbox Code Playgroud)

Try*_*yph 9

您可以通过示例看到的奇怪行为不是由于+运算符和追加函数之间的差异.

这是因为您将一个列表作为默认值分配给一个函数参数,并在一个局部变量中分配一个串联的结果g.


这并不广为人知,但将列表(或字典或对象)定义为参数默认值可能不是您想要的.执行此操作时,用作参数默认值的列表将在所有函数调用中共享.

所以对于f功能:

  1. 如果没有L参数,第一次调用它,将获取默认值([])并附加2.所以它变成了[2]
  2. 如果没有L参数再次调用它,则会采用默认值,但现在是[2].2将再次附加,它[2, 2]现在成为您的函数的默认值.

对于g功能:

  • 至于该f函数,默认值是一个空列表,但永远不会修改此列表.实际上,结果L + [2]会受到局部变量的影响,L并且函数的默认值保持不变.因此,当您再次调用该函数时,默认值始终为[].
  • 正如Klimenkomud在他的回答中所说,使用+=运算符而不是连接,并且赋值实际上修改了L参数的默认值.如果这样做,该g功能将像该f功能一样.

作为结论,使用空列表作为参数默认值几乎不是您想要的.相反,你可能想要这个:

def f(a, L=None):
    L = L or []
    ...
Run Code Online (Sandbox Code Playgroud)