operator + =与collections.Counter的行为不一致

时间:2016-03-11 15:58:53

标签: python collections operator-keyword

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})]。发生了什么事?

1 个答案:

答案 0 :(得分:5)

仅当x += y具有x方法时,

x才会对__iadd__产生另一个引用。如果它只有__add__,则x += yx = x + y完全相同。 collections.Counter拥有__iadd__,但确实有__add__的内容。因此,z += ...z = z + ...相同,您只需重新定义z而不是修改对象。 (我通过使用help(collections.Counter)并搜索__iadd__找到了它。它没有它。)