运算符 += 与 collections.Counter 的行为不一致

The operator += has inconsistent behavior with collections.Counter

In [20]: from collections import Counter

In [21]: x = [Counter()]

In [22]: z = x[0]

In [23]: z.update("w")

In [24]: z
Out[24]: Counter({'w': 1})

In [25]: x
Out[25]: [Counter({'w': 1})]

In [26]: z += Counter(["q"])

In [27]: z
Out[27]: Counter({'q': 1, 'w': 1})

In [28]: x
Out[28]: [Counter({'w': 1})]

我原以为 x 会是 [Counter({'q': 1, 'w': 1})]。发生了什么事?

仅当 x 具有 __iadd__ 方法时,

x += y 才会影响对 x 的另一个引用。如果它只有 __add__,则 x += yx = x + y 完全相同。 collections.Counter__iadd__ 但确实有 __add__ 的东西。因此,z += ...z = z + ... 相同,您只是重新定义 z 而不是修改对象。 (我通过使用 help(collections.Counter) 并搜索 __iadd__ 发现了这一点。它没有。)