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})]
。发生了什么事?
答案 0 :(得分:5)
x += y
具有x
方法时, x
才会对__iadd__
产生另一个引用。如果它只有__add__
,则x += y
与x = x + y
完全相同。 collections.Counter
是不拥有__iadd__
,但确实有__add__
的内容。因此,z += ...
与z = z + ...
相同,您只需重新定义z
而不是修改对象。 (我通过使用help(collections.Counter)
并搜索__iadd__
找到了它。它没有它。)