运算符 += 与 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 += y
与 x = x + y
完全相同。 collections.Counter
是 不 有 __iadd__
但确实有 __add__
的东西。因此,z += ...
与 z = z + ...
相同,您只是重新定义 z
而不是修改对象。 (我通过使用 help(collections.Counter)
并搜索 __iadd__
发现了这一点。它没有。)
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 += y
与 x = x + y
完全相同。 collections.Counter
是 不 有 __iadd__
但确实有 __add__
的东西。因此,z += ...
与 z = z + ...
相同,您只是重新定义 z
而不是修改对象。 (我通过使用 help(collections.Counter)
并搜索 __iadd__
发现了这一点。它没有。)