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

2. 先说结论

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

3. 开始分析

  • 复合对象:包含其他对象的对象,如列表、类实例等
  • 模块、方法、堆栈跟踪、堆栈帧、文件、套接字、窗口、数组等不能被拷贝
  • 示例
  1. # 例1
  2. import copy # 导入 copy 模块
  3. list1_1 = [0, 1, 2, ['a', 'b']]
  4. list1_2 = list1_1 # 赋值
  5. list1_3 = list1_1.copy() # 浅拷贝;同 list1_3 = list1_1[:]
  6. list1_4 = copy.copy(list1_1) # 浅拷贝
  7. list1_5 = copy.deepcopy(list1_1) # 深拷贝
  8. # 打印出拷贝后的 list1_1 ~ list1_5
  9. print("list1_1 =", list1_1)
  10. print("list1_2 =", list1_2)
  11. print("list1_3 =", list1_3)
  12. print("list1_4 =", list1_4)
  13. print("list1_5 =", list1_5)
  14. print('-'*40) # 分割线
  15. list1_1.append(4) # 在 list1_1 末尾添加一个元素 4
  16. list1_1[3].append('c') # 向 list1_1 中内嵌的列表末尾添加一个元素 'c'
  17. # 打印出更改后的 list1_1 ~ list1_5
  18. print("list1_1' =", list1_1)
  19. print("list1_2' =", list1_2)
  20. print("list1_3' =", list1_3)
  21. print("list1_4' =", list1_4)
  22. 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. 原对象中非第一层的不可变元素重新生成时,浅拷贝的新对象中的对应元素保持不变

[随笔重写] Python3 的深拷贝与浅拷贝的更多相关文章

  1. Python3的深拷贝和浅拷贝

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

  2. [Python3 填坑] 009 深拷贝与浅拷贝

    目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 Python3.7 官方文档 2.2 赋值.切片与 copy() 分析 分析 分析 分析 2.3 copy 模块 分析 分析 2.4 小 ...

  3. Objective-C中的深拷贝和浅拷贝

    在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝.说白了,对非容器类的浅拷贝就是拷贝对象的地址,对象里面存的内容仍然是一份,没有新的内存被分配.对非容器类的深拷贝就是重写分配一块内存,然后把 ...

  4. $.extend()的深拷贝和浅拷贝详细讲解

    版权声明:作者原创,转载请注明出处! 语法:jQuery.extend( [deep ], target, object1 [, objectN ] ) 描述: 将两个或更多对象的内容合并到第一个对象 ...

  5. [C#进阶系列]专题一:深入解析深拷贝和浅拷贝

    一.前言 这个星期参加了一个面试,面试中问到深浅拷贝的区别,然后我就简单了讲述了它们的之间的区别,然后面试官又继续问,如何实现一个深拷贝呢?当时只回答回答了一种方式,就是使用反射,然后面试官提示还可以 ...

  6. 设计模式_11_原型模式(prototype)深拷贝、浅拷贝

    设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...

  7. 浅析C#深拷贝与浅拷贝

    1.深拷贝与浅拷贝   拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个“一模一样”的新对象出来.虽然都是复制对象,但是不同的 复制方法,复制出来的新对象却并 ...

  8. 浅析C#深拷贝与浅拷贝(转)

    1.深拷贝与浅拷贝   拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个“一模一样”的新对象出来.虽然都是复制对象,但是不同的 复制方法,复制出来的新对象却并 ...

  9. java对象克隆以及深拷贝和浅拷贝

    1.什么是"克隆"? 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不 ...

随机推荐

  1. 博弈论(Game Theory)相关Paper阅读

    这些论文是我在研究区块链共识算法的时候搜到的,当然大多数跟区块链没什么关系,不过有些论文真的写的好,作者中不乏有诺奖得主,有些论文的结果是有违常的(比如拍卖中的价高者得),这也是这些Paper的一部分 ...

  2. spring jpa 带参数分页查询(一)

    1.写个接口继承JpaRepository @NoRepositoryBean public interface BaseRepository<T,PK extends Serializable ...

  3. 做股票软件用的各种k线图

    这是各种k线图地址: http://echarts.baidu.com/echarts2/doc/example.html 个人公众号谢谢各位老铁支持 本人qq群也有许多的技术文档,希望可以为你提供一 ...

  4. SQL server int 转char类型

    CONVERT(CHAR,c.battery_board_id) CONVERT(VARCHAR,c.battery_board_id)

  5. webpack配置反向代理

    devServer: { contentBase: path.resolve(__dirname, "../dev"), compress: true, port: ,//本身的端 ...

  6. HDU 3613 Best Reward ( 拓展KMP求回文串 || Manacher )

    题意 : 给个字符串S,要把S分成两段T1,T2,每个字母都有一个对应的价值,如果T1,T2是回文串,那么他们就会有一个价值,这个价值是这个串的所有字母价值之和,如果不是回文串,那么这串价值就为0.问 ...

  7. [luogu]P2279 [HNOI2003]消防局的设立[贪心]

    [luogu]P2279 [HNOI2003]消防局的设立 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两 ...

  8. CG-CTF | 密码重置2

    跟则提示走,美滋滋: 1.找到邮箱: 2.下载备份: 3.PHP弱类型,string与int用的是“==” ........这一行是省略的代码........ if(!empty($token)&am ...

  9. es的脑裂

    一个正常es集群中只有一个主节点,主节点负责管理整个集群,集群的所有节点都会选择同一个节点作为主节点:所以无论访问那个节点都可以查看集群的状态信息. 而脑裂问题的出现就是因为从节点在选择主节点上出现分 ...

  10. LR之流程

    一.新建事务 如何估算一个业务流程呢?一个业务流程的持续时间:登录,预定机票等等的花费时间,通常是几个步骤构成的,所以在LR中需要标记事物,作为评测业务的时间. 1.打开Basic_Tutorial脚 ...