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

标签 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]

最佳答案

您在示例中看到的奇怪行为不是由于 + 运算符和追加函数之间的差异所致。

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


这不是广为人知,但将列表(或字典或对象)定义为参数默认值可能不是您想要的。当您这样做时,用作参数默认值的列表将在所有函数调用之间共享。

所以对于 f 函数:

  1. 您第一次调用它时没有使用 L 参数,将采用默认值 ([]) 并附加 2。所以它变成了[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 []
    ...

关于python - python中的 "append"和 "+"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51780924/

相关文章:

python - 对字典键的子集进行排序

python - 类型错误 ('module' 对象不可调用)使用 dateutil relativedelta

python - 如何根据其他数据框过滤一个 Pandas 数据框日期

python - Spyder 和 Jupyter 有什么区别?

python - 如何提取<table>下的所有源代码并导出为html?

python - 'type' 对象在使用 django_enums 时不可迭代

python - Python类中返回方法调用结果的常见方法是什么?

python - skimage 在 LAB 色彩空间中为每个 channel 使用什么范围?

python - 无法创建 Django ValueError 对象,因为数据未验证

python - 通过机器学习从网页中提取信息