在 Python 之中,如果想要复制一个对象就免不了要理解浅复制与深复制。这也是 Python 与其他语言的区别之一。

Python 的数据存储方式与其他语言不同。当你定义了一个变量:

a = [, , , , ]

这在 Python 中就表示在内存中开辟了一个空间,这个空间里存储了[0, 1, 2, 3, 4],然后变量a里存储这个内存空间的地址。

>>> a=[0, 1, 2, 3, 4]
>>> b = a
>>> print(b)
[0, 1, 2, 3, 4]
>>> a = [1]
>>> print(a)
[1]
>>> print(b)
[0, 1, 2, 3, 4]

这里我们可以清楚的看到,b = a 相当于在 b 中存储了当前 a 中记录的内存地址。当 a = [1] 时 Python 解释器又在内存中开辟了一个空间存储 [1] 并且在 a 中存储了它的地址。

但是整个过程中 b 依然存储了当初的 [0, 1, 2, 3, 4] 的存储地址,所以 b 的内容不变。

>>> a = [0, 1, 2, 3, 4]
>>> b = a
>>> a[0] = 99999
>>> print(a)
[99999, 1, 2, 3, 4]
>>> print(b)
[99999, 1, 2, 3, 4]

这里我修改了 a[0] 的值,相当于修改了在内存中存储的值,a 与 b 存储着一样的地址,当里面的内容改变时,自然输出的值也都改变了。

Python 中的浅复制与深复制:

理解了 Python 中的变量存储方式,我们再来说什么是浅复制与深复制。

>>> import copy
>>> a = [0, 1, 2, 3, 4]
>>> b = copy.copy(a)
>>> c = copy.deepcopy(a)
>>> a[0] = 10086
>>> print(b)
[0, 1, 2, 3, 4]
>>> print(c)
[0, 1, 2, 3, 4]
>>> print(a)
[10086, 1, 2, 3, 4]

可以看到,当 a 时一个简单的字典、元祖、列表时,使用浅复制或深复制时修改 a 的值都不会使复制的对象值发生变化。

>>> import copy
>>> a = [0, 1, 2, [0, 1]]
>>> b = copy.copy(a)
>>> c = copy.deepcopy(a)
>>> a[3][0] = 10086
>>> print(a)
[0, 1, 2, [10086, 1]]
>>> print(b)
[0, 1, 2, [10086, 1]]
>>> print(c)
[0, 1, 2, [0, 1]]

但是当 a 是一个复杂的列表时,例如这里时一个嵌套了列表的列表。当修改 a 中嵌套列表的值就会使浅复制的 b 中的值也发生改变。

结论

直接赋值 :只是将内存地址给了对象。

浅复制:只将父对象拷贝了一遍。

深复制:将父对象与子对象都拷贝了。

最新文章

  1. 最小和(min)
  2. Python 学习笔记二
  3. Activity的成员变量
  4. M方法和D方法的区别
  5. ECshop中TemplateBeginEditable 和后台编辑讲解
  6. System.Data.Entity.Internal.AppConfig 类型初始值设定项引发异常
  7. Linux用户空间与内核空间
  8. Android 开发第三天
  9. JavaScript高级程序设计54.pdf
  10. --@angularJS--指令与控制器之间较复杂的交互demo2
  11. 应付模块的R12 TRACE 和 FND Debug 文件 / FND 日志 调试
  12. [Swift]LeetCode88. 合并两个有序数组 | Merge Sorted Array
  13. linux 命令 — grep
  14. 20155209 林虹宇 Exp3 免杀原理与实践
  15. linux中iptables的用法
  16. EF学习-获取实体框架01
  17. Mac在终端用命令装载dmg文件
  18. Ubuntu 12.04 LTS 下配置 apache支持SPDY, 使用wireshark 抓包分析SPDY 协议
  19. IIS_常见问题及解决方法
  20. linux下实现多台服务器同步文件(inotify-tools+rsync实时同步文件安装和配置)

热门文章

  1. Zabbix-3.0.3实现微信(WeChat)报警
  2. 吴裕雄--天生自然python编程:实例(2)
  3. Java Design Patterns(2)
  4. 在 macOS 上试用 Gentoo/Prefix
  5. Android中的路径记录
  6. 【转载】checkbox实现全选/取消全选
  7. 推荐系统--隐语义模型LFM
  8. Ueditor富文本编辑器--上传图片自定义上传操作
  9. 4款java快速开发平台推荐
  10. Day 3 DP