我设置了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'}
当前回答
如果你的字典是映射类型,你不能.copy()它,但你可以
dict2 = dict1 | {}
它有点模糊,与copy.copy(dict1)相比,我不能说它的性能如何,但它非常简洁。
其他回答
起初,这也让我感到困惑,因为我来自C语言背景。
在C语言中,变量是内存中具有已定义类型的位置。对变量赋值会将数据复制到变量的内存位置。
但在Python中,变量更像是指向对象的指针。因此,将一个变量赋值给另一个变量并不会产生复制,它只是使变量名指向相同的对象。
你可以通过调用带有额外关键字参数的dict构造函数,一次复制和编辑新构造的副本:
>>> dict1 = {"key1": "value1", "key2": "value2"}
>>> dict2 = dict(dict1, key2="WHY?!")
>>> dict1
{'key2': 'value2', 'key1': 'value1'}
>>> dict2
{'key2': 'WHY?!', 'key1': 'value1'}
在python 3.5+上,有一种更简单的方法来实现浅拷贝,即使用** unpackaging操作符。由Pep 448定义。
>>>dict1 = {"key1": "value1", "key2": "value2"}
>>>dict2 = {**dict1}
>>>print(dict2)
{'key1': 'value1', 'key2': 'value2'}
>>>dict2["key2"] = "WHY?!"
>>>print(dict1)
{'key1': 'value1', 'key2': 'value2'}
>>>print(dict2)
{'key1': 'value1', 'key2': 'WHY?!'}
**将字典解包到一个新字典中,然后分配给dict2。
我们还可以确认每个字典都有一个不同的id。
>>>id(dict1)
178192816
>>>id(dict2)
178192600
如果需要深度复制,那么copy.deepcopy()仍然是可行的方法。
我遇到了一个奇怪的行为时,试图深度复制类的字典属性w/o赋值给变量
New = copy.deepcopy(my_class.a)不工作,即修改New修改my_class.a
但如果你用old = my_class。A然后new = copy.deepcopy(旧)它工作得很好,即修改new不会影响my_class.a
我不知道为什么会发生这种情况,但希望它有助于节省一些时间!:)
除了其他提供的解决方案,您还可以使用**将字典集成到一个空字典中,例如:
Shallow_copy_of_other_dict = {**other_dict}。
现在您将拥有other_dict的“浅”副本。
应用于你的例子:
>>> dict1 = {"key1": "value1", "key2": "value2"}
>>> dict2 = {**dict1}
>>> dict2
{'key1': 'value1', 'key2': 'value2'}
>>> dict2["key2"] = "WHY?!"
>>> dict1
{'key1': 'value1', 'key2': 'value2'}
>>>
指针:浅拷贝和深拷贝的区别