1. Python3 关于深浅拷贝的官方文档

  • 文档地址:Python3.7.2
  • 源码地址:lib/copy.py

2. 先说结论

  • 深拷贝与浅拷贝是对复合对象而言的
  • 深拷贝会构造一个新的复合对象,然后递归地将在原始对象中所有元素的副本对应地写入新复合对象中
  • 浅拷贝会构造一个新的复合对象,然后(在允许的前提下)向其中写入对原始对象的引用

3. 开始分析

  • 复合对象:包含其他对象的对象,如列表、类实例等
  • 模块、方法、堆栈跟踪、堆栈帧、文件、套接字、窗口、数组等不能被拷贝
  • 示例
# 例1import copy                         # 导入 copy 模块list1_1 = [0, 1, 2, ['a', 'b']]
list1_2 = list1_1                   # 赋值
list1_3 = list1_1.copy()            # 浅拷贝;同 list1_3 = list1_1[:]
list1_4 = copy.copy(list1_1)        # 浅拷贝
list1_5 = copy.deepcopy(list1_1)    # 深拷贝# 打印出拷贝后的 list1_1 ~ list1_5
print("list1_1 =", list1_1)
print("list1_2 =", list1_2)
print("list1_3 =", list1_3)
print("list1_4 =", list1_4)
print("list1_5 =", list1_5)
print('-'*40)                       # 分割线list1_1.append(4)                   # 在 list1_1 末尾添加一个元素 4
list1_1[3].append('c')              # 向 list1_1 中内嵌的列表末尾添加一个元素 'c'# 打印出更改后的 list1_1 ~ list1_5
print("list1_1' =", list1_1)
print("list1_2' =", list1_2)
print("list1_3' =", list1_3)
print("list1_4' =", list1_4)
print("list1_5' =", list1_5)

>>>

list1_1 = [0, 1, 2, ['a', 'b']]
list1_2 = [0, 1, 2, ['a', 'b']]
list1_3 = [0, 1, 2, ['a', 'b']]
list1_4 = [0, 1, 2, ['a', 'b']]
list1_5 = [0, 1, 2, ['a', 'b']]
----------------------------------------
list1_1' = [0, 1, 2, ['a', 'b', 'c'], 4]
list1_2' = [0, 1, 2, ['a', 'b', 'c'], 4]
list1_3' = [0, 1, 2, ['a', 'b', 'c']]
list1_4' = [0, 1, 2, ['a', 'b', 'c']]
list1_5' = [0, 1, 2, ['a', 'b']]

  • 由例1 可看出

    1. 简单的赋值只是将引用传给新对象,新旧对象除变量名外毫无区别
    2. 原对象中非第一层的可变元素发生变化时,浅拷贝的新对象中的对应元素同步变化
    3. 深拷贝的新对象是一个真正的副本,不随原对象的改变而改变
  • 补充
    1. 拷贝后的新对象占用新的空间,但其内部的元素指向原对象内部对应元素的地址
    2. 原对象中非第一层的不可变元素重新生成时,浅拷贝的新对象中的对应元素保持不变

转载于:https://www.cnblogs.com/yorkyu/p/10328162.html

[随笔重写] Python3 的深拷贝与浅拷贝相关推荐

  1. Python3的深拷贝和浅拷贝

    a = 1 b = a a = 2 print(a, b) print(id(a), id(b)) """ 运行结果 2 1 1445293568 1445293536 ...

  2. PHP中对象的深拷贝与浅拷贝

    2019独角兽企业重金招聘Python工程师标准>>> 最近写了一个php脚本,在脚本中使用到了SplPriorityQueue,会用到两次 因此写了如下: $res=$tmp_re ...

  3. Java深拷贝与浅拷贝

    前言 对象拷贝Object Copy是将一个对象的属性,拷贝到另一个相同类型的对象中.拷贝对象主要是为了在新的上下文环境中复用对象的部分或全部数据.其中对象拷贝有3种类型:深拷贝Deep Copy.浅 ...

  4. python中copy模块的使用,深拷贝和浅拷贝

    python中copy模块的使用,深拷贝和浅拷贝 文章目录: 一.copy模块的介绍 1.copy模块 二.copy模块的使用 拓展说明: 1.id( )函数的使用 2.is和== 的区别 pytho ...

  5. 深拷贝与浅拷贝、空类与空数组

    一.深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝,如下图(v2 从 v 拷贝而来): 如果只是分配指针本身的内存,那就是浅拷贝,如下图: ...

  6. java 深拷贝_java 深拷贝与浅拷贝机制详解

    java 深拷贝与浅拷贝机制详解 概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定 ...

  7. 深入浅出解释深拷贝、浅拷贝、对象拷贝、引用拷贝原理和应用

    拷贝总体上分为引用拷贝和对象拷贝. 1. 引用拷贝 创建一个指向对象的引用变量的拷贝. public class QuoteCopy {public static void main(String[] ...

  8. java拷贝函数_Java的深拷贝与浅拷贝的几种实现方式

    1.介绍 关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象.可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传 ...

  9. 学习Java的深拷贝和浅拷贝

    关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象.可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用 ...

最新文章

  1. springboot 读取配置文件内容的几种方式
  2. jar包 和 war包?
  3. SAP Cloud SDK‘s Virtual Data Model
  4. linux抓取网络信息,Linux获取所有网口及其详细信息
  5. 计算机信息安全专业欧洲排名,美国大学信息安全专业排名TOP10一览 加州大学伯克利分校居首...
  6. Response.Redirect ,Server.Excute和Server.Transfer区别详解
  7. 解决:com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused:
  8. EntityManager的使用
  9. python语言中内置的字符串排版方法_Python14之字符串(各种奇葩的内置方法)
  10. vue element table
  11. SQL中datetime和timestamp的区别
  12. hadoop-执行mapreduce时hang住的问题
  13. (六省)蓝桥真题 奇妙的数字
  14. 艺术与科技的跨界融合 Jya美学家电品牌发布
  15. Ubuntu16.04+VMware15.0.4系统瘦身
  16. .nav ul .mall a:hover 是什么意思
  17. 什么是UserAgent
  18. 关于网线水晶头的接法详解
  19. SQL分析在2020年度第一季度的购买人数,销售金额,客单价,客单件人均购买频次(时间函数、分组汇总、常用指标计算)
  20. 台湾--电话正则表达式

热门文章

  1. 数据结构-- 线性表之链式存储
  2. 每日一题(4)—— (a ^ b 2)
  3. 复习Object类_日期时间类_System类_StringBuilder_包装类以及各类的细节
  4. winre drv分区干嘛用的_都2020年了,还在给硬盘分区?看完你就知道有没有必要了...
  5. Express接口案例——完成文章评论相关的接口
  6. LeetCode 656. 金币路径(DP)
  7. LeetCode 253. 会议室 II(贪心+优先队列)
  8. LeetCode 245. 最短单词距离 III
  9. LeetCode 399. 除法求值(图的DFS搜索)
  10. LeetCode 423. 从英文中重建数字(找规律)