Python,从字典创建新变量?不像看上去那么直截了当?

Python,从字典创建新变量?不像看上去那么直截了当?,python,dictionary,Python,Dictionary,我正在尝试创建一个新的变量,它将包含一个现有的字典,这样我就可以在不影响旧字典的情况下更改新字典中的内容。当我尝试下面的方法时,我认为这是一种显而易见的方法,当我编辑新词典时,它似乎仍然在编辑我原来的词典。。我一直在寻找关于这个的信息,但似乎找不到任何东西,任何信息都是感激的 newdictionary = olddictionary 您只是将makenewdictionary指向相同的参考olddictionary指向。 请参阅(它是关于列表的,但也适用于dicts) 改为使用(注意:这

我正在尝试创建一个新的变量,它将包含一个现有的字典,这样我就可以在不影响旧字典的情况下更改新字典中的内容。当我尝试下面的方法时,我认为这是一种显而易见的方法,当我编辑新词典时,它似乎仍然在编辑我原来的词典。。我一直在寻找关于这个的信息,但似乎找不到任何东西,任何信息都是感激的

newdictionary = olddictionary

您只是将make
newdictionary
指向相同的参考
olddictionary
指向。 请参阅(它是关于列表的,但也适用于dicts)


改为使用(注意:这将创建一个浅拷贝):

要创建深度复制,可以使用“复制”模块中的

newdictionary = copy.deepcopy(olddictionary)
维基百科:

像Python中那样的赋值只会使
newdictionary
名称引用与
olddictionary
相同的内容,正如您所注意到的那样。您可以使用
dict()
构造函数创建新词典:

newdictionary = dict(olddictionary)
请注意,这是一个浅拷贝。有关深度副本,请参见标准库模块

newdictionary = dict(olddictionary.items())
这将创建一个新副本(更具体地说,它将olddict的内容作为(键,值)对提供给dict,dict将从(键,值)对构造一个新字典)

编辑:哦,是的,复制-完全忘记它,这是正确的方法

a = b

只复制引用,而不复制对象。

您只是在创建对同一词典的另一个引用

您需要制作一份副本:使用以下其中一项(在检查文档中每个文档的功能后):


您正在创建引用,而不是副本。为了制作一份完整的副本并保持原稿不动,您需要
copy.deepcopy()
。因此:

from copy import deepcopy
dictionary_new = deepcopy(dictionary_old)

仅使用
a=dict(b)
a=b.copy()
将进行浅拷贝,并将词典中的任何列表作为彼此的引用(这样,尽管编辑其他项不会导致问题,但编辑一个词典中的列表也会导致另一个词典中的更改).

我想你需要一份深度副本来满足你的要求。看

它就像dict.copy()做浅拷贝一样,这是Rick不想要的


那么对于任何变量都是一样的?我想我在这之前完全忽略了python的这一方面,因为我对它非常陌生still@Rick:是的,对于任何Python变量都是如此。但是,您不会注意到数字和字符串,因为它们不是可变值。列表和字典是可变的。是的,所有类型都是一样的。嗯,
a.b=c
稍有不同,因为它调用了一个以c和b为参数的(
\uuuu setattribute\uuuu
afaik)方法。但默认情况下,它仍然复制引用。Edit为@Greg Hewgill+1提供了关于易变性的信息。谢谢,非常好的信息让我开始深入研究这个问题topic@delnan:这是Python2.X还是Python3.X的答案?如果是2.X,您不认为
iteritems
可能更好吗?当有更好的方法可用时,为什么要使用这两种方法?@delnan:来自文档:“如果位置参数arg是一个映射对象,请返回一个字典,将相同的键映射到与映射对象相同的值。”@delnan:请以可以理解的方式分享您的智慧:什么代码?怎么了?哎哟,我的道歉(还有我的投票)。Edit@John:我假设dict()对映射的作用与对所有其他iterable的作用相同,因为它只是对其进行迭代(默认情况下,dict只生成它们的键),这是行不通的。但正如所指出的,它确实正确地处理了映射。请注意,这将创建一个浅拷贝-字典中的项,如列表或其他字典,将保持相互引用,并且您的相同问题将再次出现。+1来自我-这变成了一个很好的解释。我以前从来都不知道yuml。谢谢,这是最简单/最直接的答案,尽管我感谢大家在这方面的帮助
new = dict(old)

new = old.copy()

import copy
new = copy.copy(old)

import copy
new = copy.deepcopy(old)
from copy import deepcopy
dictionary_new = deepcopy(dictionary_old)
from copy import deepcopy
d = {}
d['names'] = ['Alfred', 'Bertrand']
c = d.copy()
dc = deepcopy(d)