为什么 Python collections.Counter 在引用其值时会发生变异

Why does a Python collections.Counter get mutated when its values are referenced

我不太确定这里发生了什么:

from collections import defaultdict, Counter

c1 = defaultdict(Counter)
c2 = defaultdict(Counter)

c1[1][2] = 3
c1[2][3] = 4

keys = c1.keys()

for i in keys:
  c2[i] = c1[i]
  
  for k in keys:
    if k < i:
      c2[i] += c1[k]
      
c1

显示:

defaultdict(collections.Counter,
            {1: Counter({2: 3}), 2: Counter({3: 4, 2: 3})})

为什么c1会变异?我知道可以通过将 c2[i] = c1[i] 更改为 c2[i] += c1[i] 来消除突变。但我的目标是理解为什么上面的代码片段会发生变异 c1.

这里有两个计数器字典,然后在第二个字典中从第一个字典为现有计数器创建额外的 link,因此 c2[i] is c1[i] == True,这是同一个计数器实例。你可以使用

c2[i] = c1[i].copy()

如果你愿意,它比c2[i] += c1[i]更明确。