[随笔重写] Python3 的深拷贝与浅拷贝
1. Python3 关于深浅拷贝的官方文档
- 文档地址:Python3.7.2
- 源码地址:lib/copy.py
2. 先说结论
- 深拷贝与浅拷贝是对复合对象而言的
- 深拷贝会构造一个新的复合对象,然后递归地将在原始对象中所有元素的副本对应地写入新复合对象中
- 浅拷贝会构造一个新的复合对象,然后(在允许的前提下)向其中写入对原始对象的引用
3. 开始分析
- 复合对象:包含其他对象的对象,如列表、类实例等
- 模块、方法、堆栈跟踪、堆栈帧、文件、套接字、窗口、数组等不能被拷贝
- 示例
# 例1
import 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 可看出
- 简单的赋值只是将引用传给新对象,新旧对象除变量名外毫无区别
- 原对象中非第一层的可变元素发生变化时,浅拷贝的新对象中的对应元素同步变化
- 深拷贝的新对象是一个真正的副本,不随原对象的改变而改变
补充
- 拷贝后的新对象占用新的空间,但其内部的元素指向原对象内部对应元素的地址
- 原对象中非第一层的不可变元素重新生成时,浅拷贝的新对象中的对应元素保持不变
[随笔重写] Python3 的深拷贝与浅拷贝的更多相关文章
- Python3的深拷贝和浅拷贝
a = 1 b = a a = 2 print(a, b) print(id(a), id(b)) """ 运行结果 2 1 1445293568 1445293536 ...
- [Python3 填坑] 009 深拷贝与浅拷贝
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 Python3.7 官方文档 2.2 赋值.切片与 copy() 分析 分析 分析 分析 2.3 copy 模块 分析 分析 2.4 小 ...
- Objective-C中的深拷贝和浅拷贝
在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝.说白了,对非容器类的浅拷贝就是拷贝对象的地址,对象里面存的内容仍然是一份,没有新的内存被分配.对非容器类的深拷贝就是重写分配一块内存,然后把 ...
- $.extend()的深拷贝和浅拷贝详细讲解
版权声明:作者原创,转载请注明出处! 语法:jQuery.extend( [deep ], target, object1 [, objectN ] ) 描述: 将两个或更多对象的内容合并到第一个对象 ...
- [C#进阶系列]专题一:深入解析深拷贝和浅拷贝
一.前言 这个星期参加了一个面试,面试中问到深浅拷贝的区别,然后我就简单了讲述了它们的之间的区别,然后面试官又继续问,如何实现一个深拷贝呢?当时只回答回答了一种方式,就是使用反射,然后面试官提示还可以 ...
- 设计模式_11_原型模式(prototype)深拷贝、浅拷贝
设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...
- 浅析C#深拷贝与浅拷贝
1.深拷贝与浅拷贝 拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个“一模一样”的新对象出来.虽然都是复制对象,但是不同的 复制方法,复制出来的新对象却并 ...
- 浅析C#深拷贝与浅拷贝(转)
1.深拷贝与浅拷贝 拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个“一模一样”的新对象出来.虽然都是复制对象,但是不同的 复制方法,复制出来的新对象却并 ...
- java对象克隆以及深拷贝和浅拷贝
1.什么是"克隆"? 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不 ...
随机推荐
- 神经网络训练技巧:训练参数初始化、Drop out及Batch Normalization
参数初始化: xavier初始化: https://blog.csdn.net/VictoriaW/article/details/73000632 条件:优秀的初始化应该使得各层的激活值和梯度的方差 ...
- YUM源使用阿里镜像
备份系统自带的yum源 # 前提:需要联网才能使用 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bac ...
- 接触oracle的第二天
1.2 Sqlplus 这是一个轻量级的功能强大的客户端, 是 dba 必须掌握的工具. 我们可以配置 sqlplus 的一些行为,两个命令: show. 用来显示配置参数 set. 用来设置配置参数 ...
- Django【第20篇】:Ajax
初始Ajax 一.Ajax准备知识:json 说起json,我们大家都了解,就是python中的json模块,那么json模块具体是什么呢?那我们现在详细的来说明一下 1.json(Javascrip ...
- expect自动远程拷贝脚本
expect自动远程拷贝脚本,利用rsync命令,脚本内容如下: #!/usr/bin/expect -- proc Usage_Exit {self} { puts "" put ...
- 3D世界变换
一直弄不清3D场景中scaleOrientation的作用,还有scale.orientation(roation).translation的顺序问题,以往都是试图查一下,关于前者网上几乎找不到什么清 ...
- 分布式事务 GTS 的价值和原理浅析
GTS 今年双 11 的成绩 今年 2684 亿的背后,有一个默默支撑,低调到几乎被遗忘的中间件云产品——GTS(全局事务服务,Global Transaction Service),稳稳地通过了自 ...
- mysql LIKE通配符 语法
mysql LIKE通配符 语法 作用:用于在 WHERE 子句中搜索列中的指定模式.惠州大理石平板 语法:SELECT column_name(s) FROM table_name WHERE co ...
- linux ubantu php composer安装
root@iZwz93telmwbh624e5zetqZ:~# php -v PHP 5.6.40-14+ubuntu16.04.1+deb.sury.org+1 (cli) Copyright (c ...
- spring学习笔记之---IOC和DI
IOC和DI (一)IOC (1) 概念 IOC (Inverse of Control) 反转控制,就是将原本在程序中手动创建对象的控制权,交给spring框架管理.简单的说,就是创建对象控制权被反 ...