python: добавление словаря в список - я вижу поведение, похожее на указатель - PullRequest
54 голосов
/ 09 марта 2011

Я попробовал следующее в интерпретаторе python:

>>>
>>> a = []
>>> b = {1:'one'}
>>> a.append(b)
>>> a
[{1: 'one'}]
>>> b[1] = 'ONE'
>>> a
[{1: 'ONE'}]
>>>

Здесь, после добавления словаря 'b' в список 'a', я изменяю значение, соответствующее ключу 1 в словаре 'a'. Как-то это изменение отражается и в списке. Когда я добавляю словарь в список, я не просто добавляю значение словаря? Похоже, что я добавил указатель на словарь в список, и, следовательно, изменения в словаре также отражаются в списке.

Я не хочу, чтобы изменение отражалось в списке. Как мне это сделать?

Спасибо за ваше время!

Ответы [ 3 ]

99 голосов
/ 09 марта 2011

Вы правы в том, что ваш список содержит ссылку на исходный словарь.

a.append(b.copy()) должен добиться цели.

Имейте в виду, что это делает мелкую копию. Альтернативой является использование copy.deepcopy(b), что делает глубокую копию.

20 голосов
/ 09 марта 2011

Также с dict

a = []
b = {1:'one'}

a.append(dict(b))
print a
b[1]='iuqsdgf'
print a

результат

[{1: 'one'}]
[{1: 'one'}]
1 голос
/ 09 марта 2011

использовать копию и глубокую копию

http://docs.python.org/library/copy.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...