Python 中赋值语句不复制对象,而是在目标和对象之间创建绑定关系。对于自身可变或者包含可变项的集合对象,开发者有时会需要生成其副本用于改变操作,进而避免改变原对象。copy 模块提供了通用的浅层复制 copy() 和深层复制 deepcopy() 操作。

  • copy() 仅复制对象本身,而不对其中的子对象进行复制,如果对原子对象进行修改,那么浅层复制之后的对象也会随着修改。

  • deepcopy() 是真正意义上的复制,即重新开辟一片空间,经常说的复制实际上就是 deepcopy,深层复制之后的对象不受原对象的影响,无论原对象发生什么修改,深层复制的对象都不会发生改变。

>>> import copy
>>> list1 = [1, 2, [3, 4], 5]
>>> list2 = copy.copy(list1)
>>> list3 = copy.deepcopy(list1)
>>> list2 == list3
True
>>> list2 is list3
False

以上两个列表 list2 和 list3 分别经过了浅层复制和深层复制,虽然值是一样的,但是本质上并不是同一个列表

>>> import copy
>>> list1 = [1, 2, [3, 4], 5]
>>> list2 = copy.copy(list1)
>>> list3 = copy.deepcopy(list1)
>>> list1[2][0] = 3333
>>> list1
[1, 2, [3333, 4], 5]
>>> list2
[1, 2, [3333, 4], 5]
>>> list3
[1, 2, [3, 4], 5]

将原列表的子对象 [3, 4] 改成 [333, 4],可以看到浅层复制后 list2 的值也会改变,而深层复制后 list3 的值并不会改变。

简单来说:

  • 浅层复制 copy():复制父对象,子对象仍然使用引用的方式;
  • 深层复制 deepcopy():复制了对象和对象的所有子对象。

【Python 必会技巧】copy 模块中 copy() 与 deepcopy() 函数的区别相关推荐

  1. python3异步task_并发,异步编程_Python中的asyncio模块中的Future和Task的区别?,并发,异步编程,python,asyncio - phpStudy...

    Python中的asyncio模块中的Future和Task的区别? 问题一 按照官方文档的描述,Task是Futrue的一个subclass,标准库中也分别提供了create_task和create ...

  2. Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用...

    Python中str()与repr()函数的区别 from:https://www.jianshu.com/p/2a41315ca47e 在 Python 中要将某一类型的变量或者常量转换为字符串对象 ...

  3. 【Python】Python中str()和repr()函数的区别

    作用 在 Python 中要将某一类型的变量或者常量转换为字符串对象通常有两种方法,即 str() 或者 repr() . 区别与使用 参考文章:Python 中 str() 和 repr() 函数的 ...

  4. php strpose_php中strpos()和stripos()函数的区别用法详解

    本篇文章主要给大家介绍PHP中strpos()和stripos()函数的区别用法介绍,希望对需要的朋友有所帮助! strpos()函数 这个函数帮助我们找到一个字符串在另一个字符串中第一次出现的位置. ...

  5. mysql中from unixtime,mysql中FROM_UNIXTIME()和UNIX_TIMESTAMP()函数的区别

    摘要 腾兴网为您分享:mysql中FROM_UNIXTIME()和UNIX_TIMESTAMP()函数的区别,作业大师,智慧大学,优化大师,先游等软件知识,以及流星蝴蝶剑,升学指导网软件,承德大宗,q ...

  6. 【Python 必会技巧】获取字典中(多个)最大值(value)的键(key)

    先总结一下,分为以下四种情况: 情况一:最大值只有一个,只获取最大值(value)所对应的键(key) 情况二:最大值只有一个,同时获取最大值(value)和所对应的键(key) 情况三:最大值有多个 ...

  7. 【Python教程】 正则表达式 re模块中,反斜杠 “\“分割字符串的正确操作方法

    Python 语言使用反斜杠(\)作为转义符,对一些字符进行转义(escape),例如 "\n" "\r\n" 等.所以当 Python 字符串中如果出现反斜杠 ...

  8. python转换函数使用_Python Socket模块中的IP转换函数

    Python Socket模块中包含一些有用IP转换函数,说明如下: socket.ntohl(x) // 类似于C语言的ntohl(x) 把32位正整数从网络序转换成主机字节序. socket.nt ...

  9. 详解Python项目开发时自定义模块中对象的导入和使用

    背景:1)任何一个Python程序文件既可以直接执行,也可以作为模块导入再使用其中的对象:2)对于大型系统开发,一般不会把所有代码放到单个文件中,而是根据功能将其分类并分散多个模块中,在编写小型项目时 ...

最新文章

  1. js数组去重(多种方法)
  2. EnvironmentError: [WinError 5] 拒绝访问
  3. 连接虚拟机mysql无法访问_连接虚拟机mysql无法访问,报错编号1130的解决方法
  4. webpack简单修改版本号(单页面)
  5. P3292 [SCOI2016]幸运数字(树剖 + 线段树维护线性基)
  6. CDMA的完整形式是什么?
  7. 那年学过的Java笔记三核心类库三
  8. 利用iTextSharp把DataTable导出为PDF和RTF(Rich Text Format)文件
  9. PHP通过SMTP实现发送邮件_包括附件
  10. Linux vsFTPd服务详解——本地用户登录实战
  11. 快速构建express后端模版从qiya-cli开始
  12. VA番茄助手VisualAssist的神器工具教程
  13. Android超精准计步器开发-Dylan计步
  14. 一个编辑的黑洞项目:编程日历背后的 “鬼级操作”
  15. 剖析锂电池的工作原理
  16. Python正则表达式写法
  17. BZOJ 4809: 皇后
  18. Socially-Motivated Cooperative Mobile Edge Computing论文阅读
  19. 如何提问,提问技巧,如何有效的获取问题的答案
  20. 【meng_项目】python+flask+html+css制作一个简单的生日祝福语网页

热门文章

  1. 1.4Activity保存现场状态
  2. Ubuntu设置为命令行登录
  3. 结对开发——求最大值
  4. 创建IE各版本专属CSS
  5. 动态规划——最长公共子序列长度
  6. [Java]中[this][super]用法总结
  7. 关于递归函数,非递归函数中引用传参的问题
  8. Java学习笔记8-1——汇编语言入门
  9. 【应用】Properties类与Properties配置文件的读写
  10. 跨站脚本专题 XSS