首页 > 解决方案 > 为什么复制的字典的 id 与复制的字典不同?

问题描述

record={"Name":"Python","Age":"20"}
x=record.copy()
print(id(x)==id(record))

为什么当我运行它时它会给出 False 作为输出?

标签: pythondictionary

解决方案


可变对象的副本是不同且自治的实例,它们最初具有相同的内容,但可以单独更改。为了比较,不可变对象(例如元组)的副本引用相同的内存空间,因为它的内容永远不会改变。

您可以在具有相同 id 的相同内容的不可变对象(例如元组)上观察到这种现象,即使它们甚至不是彼此的副本:

>>> t = (1,2,3)
>>> id(t)
140707126155016
>>> u = (1,2,3)
>>> id(t)
140707126155016
>>>

对于可变对象(例如列表、字典),copy() 方法创建一个包含内容副本的新实例。

>>> d = [1,2,3]
>>> c = d.copy()
>>> d,id(d)
([1, 2, 3], 140707126669064)
>>> c,id(c)
([1, 2, 3], 140707126356872)
>>> c[1] = 5                  # only affects the c instance (not d)
>>> d, id(d)
([1, 2, 3], 140707126669064)
>>> c, id(c)
([1, 5, 3], 140707126356872)

一个简单的变量赋值将引用复制到同一个实例,因此两个变量(原始和赋值)引用相同的内容(可以修改):

>>> d = [1, 2, 3]
>>> c = d
>>> d[1] = 5                 # same instance seen by both c and d
>>> c, id(c)
([1, 2, 3], 140707126135240)
>>> d, id(d)
([1, 2, 3], 140707126135240)

推荐阅读