python进阶----深拷贝&浅拷贝
复制需要区分,,复制的是源文件的数据,还是指向源文件数据的地址
1.引用 b=a时,理解为b指向了a指向的数据,相当于引用复制
a=[1,2]
b=a
#验证复制的是数据还是地址
#1.查看ab的地址
id(a) #2677646858824
id(b) #2677646858824
#2. a增加1个元素,查看b是否增加
a.append(3)
a #[1,2,3]
b #[1,2,3]
2. 浅拷贝--copy.copy()
import copy
a=[1,2]
b=[3,4]
c=[a,b]
d=copy.copy(c) #验证问题1:d是否执行c地址
#验证方法1
id(d) #2677647114120
id(c) #2677644514824
#验证方法2
c.append(6)
c #[[1, 2], [3, 4], 6]
d #[[1, 2], [3, 4]]
结论:d没有指向c的地址 验证问题2:d执行a,b的地址,还是只是复制了a,b的值
#验证方法1
id(d[0]) #2677647113672
id(c[0]) #2677647113672
#验证方法2
a.append(5)
c #[[1, 2, 5], [3, 4]]
d #[[1, 2, 5], [3, 4]]
结论:,d中的a与c中的a,地址相同,说明d中的a,与c中的a均指向a的地址的
浅拷贝仅仅把最外面1层进行了copy,并没有把里面多层嵌套进行递归拷贝,里面的还是指向原来的地址
3.深拷贝 copy.deepcopy()
import copy
a=[1,2]
b=[3,4]
c=[a,b]
d=copy.deepcopy(c) #验证问题1:d是否执行c地址
#验证方法1
id(d) #2677647114120
id(c) #2677644514824
#验证方法2
c.append(6)
c #[[1, 2], [3, 4], 6]
d #[[1, 2], [3, 4]]
结论:d没有指向c的地址 验证问题2:d执行a,b的地址,还是只是复制了a,b的值
#验证方法1
id(c[0]) #2677647113672
id(d[0]) #2677645539912
#验证方法2
a.append(5)
c #[[1, 2, 5], [3, 4]]
d #[[1, 2], [3, 4]]
结论:,d中的a与c中的a,地址不同,说明d中的a是复制了a的值,并没有指向a的地址
深拷贝递归拷贝, 多层时,每层都拷贝对象的值
4.深拷贝和浅拷贝的应用
a=[1,2]
def aa(num):
num.append(3) a #[1, 2]
aa(a)
a #[1, 2, 3] #结论:函数传递的实参,一定传递的是引用地址,所以函数会改变原数据 #如果想不改变源数据需要复制,最好用深复制
aa(copy.deepcopy(a))
a #[1, 2]
5.注意事项
a=(1,2)
b=[1,2]
a1=copy.copy(a)
b1=copy.copy(b)
id(a) #
id(a1) #
id(b) #
id(b1) #
#结论:元组即使是1层,copy不拷贝,相当实用"=" #验证:元组中嵌套列表是都拷贝
a=[1,2]
b=(3,4,a)
b1=copy.copy(b)
id(b) #
id(b1) #
#结论是不拷贝
列表是可变的,,所以可以copy,元祖是不可变的,copy后改变不了,所以copy前后的2个set均不能被修改,但占用了2个空间,,没有意义但是浪费空间,所以不能copy
a=(1,2)
a1=copy.deepcopy(a)
id(a) #2677645531976
id(a1) #2677645531976 a=[1,2]
b=(3,4,a)
b1=copy.deepcopy(b)
id(b) #2677645547848
id(b1) #2677645507896
结论:如果copy的是对象多层嵌套中的对象都不可变,则深拷贝和浅拷贝都失效,仅仅指向引用,如果最外层不可变,内层嵌套中包含可变对象,浅拷贝不拷贝,指向引用,深拷贝进行copy
总结论:
浅拷贝
如果最外层是list可变的,浅拷贝只拷贝最外层,内部的指向引用,如果最外层是set不可变的,不论里面嵌套的可不可变,浅拷贝都不进行copy,只是指向引用
深拷贝
如果最外层是list可变的,深拷贝递归拷贝,如果最外层是set不可变的,里面嵌套的包含可变的,深拷贝进行copy,如果里面嵌套的也无可变的,深copy也不copy
其他
如果使用列表的切片,相当于copy.copy() 浅拷贝
如果使用字典中的copy()方法,相当于copy.copy() 浅拷贝
python进阶----深拷贝&浅拷贝的更多相关文章
- python 进阶篇 浅拷贝与深拷贝
阐述引用.浅拷贝和深拷贝前,首先需要要了解 Python 的世界里,一切皆对象,每个对象各包含一个 idendity.type 和 value. 引用(Reference) >>> ...
- python 拷贝 深拷贝 浅拷贝 赋值
t = [1,["a","b"]] t_bak = t t_cop = copy.copy(t) t_deep = copy.deepcopy(t) print ...
- python 中 深拷贝和浅拷贝的理解
在总结 python 对象和引用的时候,想到其实 对于python的深拷贝和浅拷贝也可以很好对其的进行理解. 在python中,对象的赋值的其实就是对象的引用.也就是说,当创建一个对象,然后赋给另外一 ...
- python中深拷贝和浅拷贝
python中所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝. 首先,对赋值操作我们要有以下认识: 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ). 修改不可变 ...
- [py]python的深拷贝和浅拷贝
Python深复制浅复制or深拷贝浅拷贝 简单点说 copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明 ...
- 【04】Python 深拷贝浅拷贝 函数 递归 集合
1 深拷贝浅拷贝 1.1 a==b与a is b的区别 a == b 比较两个对象的内容是否相等(可以是不同内存空间) a is b 比较a与b是否指向同一个内存地址,也就是a与b的id是否相 ...
- python集合增删改查,深拷贝浅拷贝
集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...
- python中的浅拷贝,深拷贝
直接引用,间接引用 # 1.列表存储的是索引对应值的内存地址,值会单独的开辟一个内存空间 list = ["a","b"] 内存里面存储的就是list[0],l ...
- python进阶篇
python进阶篇 import 导入模块 sys.path:获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到. import sys ...
随机推荐
- springIOC源码接口分析(七):ApplicationEventPublisher
一 定义方法 此接口主要是封装事件发布功能的接口,定义了两个方法: /** * 通知应用所有已注册且匹配的监听器此ApplicationEvent */ default void publishEve ...
- 发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方案
在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示.但是,在主线线程之外的线程中直接更新页面显示的问题是 报异常:android.vie ...
- SpringBoot整合ActiveMQ和开启持久化
一.点对点 1.提供者目录展示 2.导入依赖 <dependency> <groupId>org.springframework.boot</groupId> &l ...
- 20194651—自动生成四则运算题第一版报告chris
1.需求分析: (1)自动生成四则运算算式(+ - * /),或两则运算(+ -). (2)剔除重复算式. (3)题目数量可定制. (4)相关参数可控制. (5)生成的运算题存储到外部文件中. 2 ...
- Newcoder Wannafly13 B Jxy军训(费马小定理、分数在模意义下的值)
链接:https://www.nowcoder.com/acm/contest/80/B 题目描述 在文某路学车中学高一新生军训中,Jxc正站在太阳下站着军姿,对于这样的酷热的阳光,Jxc 表示非常不 ...
- Python 高级网络操作 - Python Advanced Network Operations
Python 高级网络操作 - Python Advanced Network Operations Half Open Socket, 一个单向的 socket 被称为 half open sock ...
- 自定义内建模块 - Python Build Your Own Built-In Module
在 python 中, 用户可以通过 py 文件创建自定义的 module, 也可以通过 C 创建 dll, 扩展 python module. 当用户在一个正在编辑的模块 module 中, 引入( ...
- VFP调用API来控制USB摄像头,实现拍照或录像
*--前提:VFP7.0以上;Windows 2K及以上*--控件:AVICAP32.DLL *--定义:一般放到主程序或表单(集)的Load事件中Public WM_CAP_DRIVER_DISCO ...
- Java生成微信分享海报【基础设计】
前言 微信后台生成海报一般都是一个模板写死,然后就完事了,过了不久让修改个模板,就又要看半天,还要考虑是否重新复制一份改一改,越来越多的重复代码,全在一个图片类里,然后就越来越乱.这两天用设计模式处理 ...
- zookeeper从入门到放弃
第1章 Zookeeper入门 1.1 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. 1.2 特点 1.3 数据结构 1.4 应用场景 提供的服务包括:统 ...