用python复制词典
我有一本包含元组的列表字典。我想创建一个字典副本,只编辑其中一个副本。以下是我常用的四种复制词典的方法:用python复制词典,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我有一本包含元组的列表字典。我想创建一个字典副本,只编辑其中一个副本。以下是我常用的四种复制词典的方法: import copy dicta = {'A':[(1,1)]} dictb = dicta.copy() dictc = dict(dicta) dictd = dict((k,v) for k,v in dicta.items()) dicte = copy.deepcopy(dicta) 如果你试图改变格言: dicta['A'][0] = [(9,9)] 您会发现,除了通过c
import copy
dicta = {'A':[(1,1)]}
dictb = dicta.copy()
dictc = dict(dicta)
dictd = dict((k,v) for k,v in dicta.items())
dicte = copy.deepcopy(dicta)
如果你试图改变格言:
dicta['A'][0] = [(9,9)]
您会发现,除了通过copy.deepcopy
创建的副本外,每个副本都指向与dicta相同的词典。尽管所有副本的dicta is dictX
返回False
,但仍会发生这种情况
这里发生了什么?仅copy.deepcopy()
递归复制字典,这就是为什么它只能工作。其他方法不会递归遍历所有字典并保留指向所有相同列表(或字典中存储的任何对象)的链接,但它们仍然返回不相同的字典(这就是为什么dicta is dictX
对于所有副本都返回False
)。例如,您可以尝试删除副本中的某些条目,而相应条目在原件中不会被删除
你可以在这里阅读更多关于它的内容:你只是复制了字典,但没有复制其中的内容。因此,您确实制作了一本新词典,但它指向了相同的列表。
dictb
到dictd
是dicta
的“浅拷贝”。这意味着它们确实是新词典(这就是为什么它们与dicta不同的原因),但它们的内容是相同的对象。看这里:
>>> dicta is dictb
False
>>> dicta['A'] is dictb['A']
True
>>> dicta['A'] is dicte['A']
False
只有deepcopy命令进入并递归复制它复制的内容。如果您尝试
dicta==dictX
,它将返回所有内容的true
,但通过copy.deepcopy
创建的副本除外
这是因为is
检查两个变量是否指向同一个对象。在这里,当您创建字典副本时,它们指向不同的字典
检查这个
>>>id(dicta)
>>>id(dictb)
>>>id(dicta['A'])
>>>id(dictb['A'])
这将消除您的疑问。dicta[“A”]返回的是什么?请注意,如果您不希望dicta['A']的新内容成为嵌套列表,那么如果您执行dicta['A']=[(9,9)],则可以使用其他复制技术。当然,如果您执行
dicta['A'][0]=(9,9)
,A是A.copy()
将返回False
。在空闲状态下尝试。a是.copy()
仅对不可变类型返回True
。对于不可变类型,a
和a.copy()
的id
是相同的。对于列表,它将返回False
。