为什么 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]
更明确。
我不太确定这里发生了什么:
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]
更明确。