Python:字典链接数据

时间:2011-08-13 18:54:29

标签: python dictionary

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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

d1d2指向内存中的同一个对象,因此更改d2中的值也会影响d1

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

使用字典类或复制模块的复制方法。

d2 = d1.copy()

from copy import copy
d2 = copy(d1)

如果你有可变对象存储在字典中(即列表)并且想要复制theese,你应该使用deepcopy函数。

from copy import deepcopy
d2 = deepcopy(d1)

答案 2 :(得分:1)

Copy字典:

d2 = d1.copy() # instead of d2 = d1

答案 3 :(得分:0)

在您的情况下,d1d2都指向同一个对象。您可以通过以下方式创建原始字典的副本:

  1. 使用d1.copy()
  2. 使用copy.copy(d1)
  3. 使用dict(d1)
  4. 使用copy.deepcopy(d1)
  5. 1,2,3将创建浅拷贝,4将创建深拷贝

答案 4 :(得分:0)

我想提出一个更好的方法来做到这一点。

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/