Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python复制词典_Python_Python 2.7_Dictionary - Fatal编程技术网

用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