我设置了dict2 = dict1。当我编辑dict2时,原来的dict1也改变了。为什么?
>>> dict1 = {"key1": "value1", "key2": "value2"}
>>> dict2 = dict1
>>> dict2["key2"] = "WHY?!"
>>> dict1
{'key2': 'WHY?!', 'key1': 'value1'}
我设置了dict2 = dict1。当我编辑dict2时,原来的dict1也改变了。为什么?
>>> dict1 = {"key1": "value1", "key2": "value2"}
>>> dict2 = dict1
>>> dict2["key2"] = "WHY?!"
>>> dict1
{'key2': 'WHY?!', 'key1': 'value1'}
当前回答
你也可以用字典理解来创建一个新字典。这避免了导入副本。
dout = dict((k,v) for k,v in mydict.items())
当然,在python >= 2.7中,你可以这样做:
dout = {k:v for k,v in mydict.items()}
但对于向后比较。,上面的方法更好。
其他回答
你可以通过调用带有额外关键字参数的dict构造函数,一次复制和编辑新构造的副本:
>>> dict1 = {"key1": "value1", "key2": "value2"}
>>> dict2 = dict(dict1, key2="WHY?!")
>>> dict1
{'key2': 'value2', 'key1': 'value1'}
>>> dict2
{'key2': 'WHY?!', 'key1': 'value1'}
>>> dict2 = dict1
# dict2 is bind to the same Dict object which binds to dict1, so if you modify dict2, you will modify the dict1
复制Dict对象有很多方法,我简单用一下
dict_1 = {
'a':1,
'b':2
}
dict_2 = {}
dict_2.update(dict_1)
当你赋值dict2 = dict1时,你并没有创建一个dict1的副本,结果是dict2只是dict1的另一个名字。
要复制像字典这样的可变类型,使用copy模块的copy / deepcopy。
import copy
dict2 = copy.deepcopy(dict1)
Python中的赋值语句不复制对象,而是在目标和对象之间创建绑定。
因此,dict2 = dict1,结果在dict2和dict1引用的对象之间产生另一个绑定。
如果你想复制字典,你可以使用copy模块。 复制模块有两个接口:
copy.copy(x)
Return a shallow copy of x.
copy.deepcopy(x)
Return a deep copy of x.
浅复制和深复制之间的区别只与复合对象(包含其他对象的对象,如列表或类实例)相关:
浅拷贝构造一个新的复合对象,然后(在可能的范围内)将对原始对象的引用插入其中。
深度复制构造一个新的复合对象,然后递归地将原始对象中的对象的副本插入其中。
例如,在python 2.7.9中:
>>> import copy
>>> a = [1,2,3,4,['a', 'b']]
>>> b = a
>>> c = copy.copy(a)
>>> d = copy.deepcopy(a)
>>> a.append(5)
>>> a[4].append('c')
结果是:
>>> a
[1, 2, 3, 4, ['a', 'b', 'c'], 5]
>>> b
[1, 2, 3, 4, ['a', 'b', 'c'], 5]
>>> c
[1, 2, 3, 4, ['a', 'b', 'c']]
>>> d
[1, 2, 3, 4, ['a', 'b']]
Dict1是一个引用底层字典对象的符号。将dict1赋值给dict2只是赋值相同的引用。通过dict2符号更改键的值将更改底层对象,这也会影响dict1。这很令人困惑。
推断不可变值比推断引用要容易得多,所以尽可能地复制:
person = {'name': 'Mary', 'age': 25}
one_year_later = {**person, 'age': 26} # does not mutate person dict
这在语法上是相同的:
one_year_later = dict(person, age=26)