python - 为什么复制的字典的 id 与复制的字典不同?
问题描述
record={"Name":"Python","Age":"20"}
x=record.copy()
print(id(x)==id(record))
为什么当我运行它时它会给出 False 作为输出?
解决方案
可变对象的副本是不同且自治的实例,它们最初具有相同的内容,但可以单独更改。为了比较,不可变对象(例如元组)的副本引用相同的内存空间,因为它的内容永远不会改变。
您可以在具有相同 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)
推荐阅读
- kubernetes - 如果我删除 etcd 中的 pod 数据,kubelet 会发生什么?
- pandas - Pandas sort_values 给出了意想不到的结果
- vue.js - 如何为带参数的链接设置 nuxt-link 的活动类?
- javascript - 将 SweetAlert2 与 TypeScript 一起使用,找不到模块“sweetalert2/dist/sweetalert2.js”的声明文件
- javascript - 在 SwitchMap 运算符中使用 Promise
- android - 如何执行向上滚动操作,直到找出需要使用 espresso 的元素
- python-3.x - 如何使用 Pandas 按降序排序日期和按升序排序时间
- python - 使用 heredocs 或更好的方法编写 Bash 脚本
- javascript - 收到欢迎信息后触发函数
- android - 如何在 Android 中使用我自己的本机代码使用第三方本机代码?