Python defaultdict更改将反映在列表中

Python defaultdict更改将反映在列表中,python,defaultdict,Python,Defaultdict,我只是在尝试defaultdict,我无法理解为什么更改defaultdict(d[1]=2)会导致列表v中的更改,尽管在值更改之前已经完成了追加。请帮忙 >>> d=defaultdict(int) >>> d[1]=1 >>> d[2]=3 >>> v=[] >>> v.append(d) >>> v.append(d) >>> v [defaultdict(<

我只是在尝试defaultdict,我无法理解为什么更改defaultdict(d[1]=2)会导致列表v中的更改,尽管在值更改之前已经完成了追加。请帮忙

>>> d=defaultdict(int)
>>> d[1]=1
>>> d[2]=3
>>> v=[]
>>> v.append(d)
>>> v.append(d)
>>> v
[defaultdict(<type 'int'>, {1: 1, 2: 3}), defaultdict(<type 'int'>, {1: 1, 2: 3})]
>>> d[1]=2
>>> v
[defaultdict(<type 'int'>, {1: 2, 2: 3}), defaultdict(<type 'int'>, {1: 2, 2: 3})]
>>
>d=defaultdict(int)
>>>d[1]=1
>>>d[2]=3
>>>v=[]
>>>五、附加(d)
>>>五、附加(d)
>>>五
[defaultdict(,{1:1,2:3}),defaultdict(,{1:1,2:3})]
>>>d[1]=2
>>>五
[defaultdict(,{1:2,2:3}),defaultdict(,{1:2,2:3})]
>>
Python中的赋值语句不复制对象,而是在目标和对象之间创建绑定。对于可变的或包含可变项的集合,有时需要一个副本,以便可以在不更改另一个副本的情况下更改一个副本

这意味着您应该在列表中添加一个
d

v.append(d.copy())

因为它们是同一个对象。因为
d
是一个引用,在您的列表中存储了两次。我如何更改代码使其不引用..@thespeaker复制对象,例如
v.append(defaultdict(int,d))
v.append(d.Copy())
v.append(Copy(d))
(请参阅)谢谢..这很有效。。我为我的愚蠢感到抱歉