Python: словари связывают данные - PullRequest
2 голосов
/ 13 августа 2011
d1 = {"dog":"woof", "cat":"meow"}
d2 = d1
d2["dog"] = "bark"
for i in d1:
    print(i, d1[i])

dog bark
cat meow

Какой лучший способ сделать это так:

dog woof
cat meow

Ответы [ 5 ]

6 голосов
/ 13 августа 2011
d1 = {"dog":"woof", "cat":"meow"}
d2 = d1.copy() # make a copy, not a reference to the same dictionary
d2["dog"] = "bark"
for i in d1:
    print(i, d1[i])

# dog woof
# cat meow
2 голосов
/ 13 августа 2011

d1 и d2 указывают на один и тот же объект в памяти, поэтому изменение значений в d2 также повлияет на d1.

d1 = {}
d2 = d1
print id(d1) == id(d2)
# out: True

Используйте метод copy из словаря или класс копирования.

d2 = d1.copy()

from copy import copy
d2 = copy(d1)

Если у вас есть изменяемые объекты, хранящиеся в словаре (то есть списки), и вы хотите скопировать их, вам следует использовать функцию deepcopy.

from copy import deepcopy
d2 = deepcopy(d1)
1 голос
/ 13 августа 2011

Скопировать в словарь:

d2 = d1.copy() # instead of d2 = d1
0 голосов
/ 21 мая 2017

Я бы хотел предложить лучший способ сделать это.

from collections import ChainMap
d1 = {"dog":"woof", "cat":"meow"}
d2 = ChainMap({}, d1)
d2["dog"] = "bark"

for i in d1:
    print(i, d1[i])
# dog woof
# cat meow

for i in d2:
    print(i, d2[i])
# dog bark
# cat meow

Пожалуйста, прочитайте ссылку на ChainMap: https://docs.python.org/3/library/collections.html#collections.ChainMap

Если вы используете python2, для реализации ChainMap используйте этот минимальный рецепт кода: https://code.activestate.com/recipes/305268/

0 голосов
/ 13 августа 2011

В вашем случае и d1, и d2 относятся к одному и тому же объекту.Вы можете создать копию оригинального диктанта:

  1. , используя d1.copy()
  2. , используя copy.copy(d1)
  3. , используя dict(d1)
  4. , используяcopy.deepcopy(d1)

1,2,3 создаст мелкие копии, а 4 - глубокую копию

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