2015-02-08 1 views
1

Я просто пытался использовать defaultdict, и я не могу понять, почему изменение defaultdict (d [1] = 2) вызывает изменение в списке v, хотя добавление было выполнено до изменения в стоимость. пожалуйста, помогите ..defaultdict changes получает отражение в списке

>>> 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})] 
>> 
+1

Поскольку они являются тем же объектом. –

+2

Поскольку 'd' является _reference_, сохраняется дважды в вашем списке. – bereal

+0

Как изменить код, чтобы он не ссылался. –

ответ

1

Назначение заявления в Python не копировать объекты, они создают привязки между мишенью и объектом. Для коллекций, которые изменяются или содержат изменяемые элементы, иногда требуется копия, поэтому можно изменить одну копию, не изменяя другую.

Это означает, что вы должны присоединять shallow copy из d в список:

v.append(d.copy())