Python copy(), deepcopy()
直接赋值
赋值是 b = a: 赋值引用,a 和 b 都指向同一个对象,内存地址相同,即a is b。
赋值不是浅拷贝。
- >>> a = [1, 2, 3]
- >>> b = a
- >>> id(a), id(b)
- (140579276041800, 140579276041800)
- >>> a, b
- ([1, 2, 3], [1, 2, 3])
- >>> a == b
- True
- >>> a is b
- True
- >>> a.append(4)
- >>> a, b
- ([1, 2, 3, 4], [1, 2, 3, 4])
copy() 浅拷贝:
创建一组拷贝对象的引用。(浅拷贝会创建一个新对象,新对象和原对象指向同一内存地址,但新对象和原对象本身内存地址不同,即值相等,内存地址不等。例:b = copy.copy(a),a==b,但a is not b)
如果原对象的可变对象改变(list),那么新对象随之改变,
如果原对象某位置的不可变对象被替换成其他值, 那么新对象将仍然用原对象的原引用值,不随之改变。
也就是说,因为浅拷贝是拷贝对象的引用,可变对象会随着原对象的改变而改变,不可变对象不变。
PS:切片操作是浅拷贝,会生成一个新的对象( id(新对象) != id(原对象) ),新的对象里保存原对象的引用。
例如:
- >>> import copy
- >>> l
- [100, 2, 3, [2, 3, 4]]
- >>> l2 = copy.copy(l)
- >>> l2
- [100, 2, 3, [2, 3, 4]]
- >>> l[0]=-1
- >>> l
- [-1, 2, 3, [2, 3, 4]]
- >>> l2
- [100, 2, 3, [2, 3, 4]]
- >>> l[-1].append(10000)
- >>> l
- [-1, 2, 3, [2, 3, 4, 10000]]
- >>> l2
- [100, 2, 3, [2, 3, 4, 10000]]
- >>> a = [1,2,3]
- >>> id(a)
- 47973832L
- >>> id(a[0])
- 41902968L
- >>> a[0]=5
- >>> id(a[0])
- 41902872L
- >>> id(a)
- 47973832L
- >>> a
- [5, 2, 3]
- >>> c = a[:]
- >>> id(c[0])
- 41902872L
- >>> id(a[0])
- 41902872L
- >>> id(a[1])
- 41902944L
- >>> id(c[1])
- 41902944L
- >>> id(c[2])
- 41902920L
- >>> id(a[2])
- 41902920L
- >>> a.append(100)
- >>> a
- [5, 2, 3, 100]
- >>> c
- [5, 2, 3]
- >>> a[0] = -1
- >>> id(a[0])
- 41903016L
- >>> id(c[0]) # a改变了,c仍然引用原对象
- 41902872L
deepcopy() 深拷贝:
对于原对象,不可变类型使用对象引用,可变类型直接复制一份。无论原对象如何改变,深拷贝出来的对象都不变。
- >>> l3 = [1,2,3,"abc",[20,30,40]]
- >>> l4 = copy.deepcopy(l3)
- >>> l4
- [1, 2, 3, 'abc', [20, 30, 40]]
- >>> l3[0] = 0
- >>> l3
- [0, 2, 3, 'abc', [20, 30, 40]]
- >>> l4
- [1, 2, 3, 'abc', [20, 30, 40]]
- >>> l3[-1].append(50)
- >>> l3
- [0, 2, 3, 'abc', [20, 30, 40, 50]]
- >>> l4
- [1, 2, 3, 'abc', [20, 30, 40]]
Python copy(), deepcopy()的更多相关文章
- Python copy and deepcopy
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...
- Python copy对象(copy与deepcopy)
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...
- Python 浅拷贝copy()与深拷贝copy.deepcopy()
首先我在这介绍两个新的小知识,要在下面用到.一个是函数 id() ,另一个是运算符 is.id() 函数就是返回对象的内存地址:is 是比较两个变量的对象引用是否指向同一个对象,在这里请不要和 == ...
- Python 函数参数引用(传值/传址)/copy/deepcopy
精简版: 传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组 ...
- Python 传值和传址 copy/deepcopy
传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组则传值:如 ...
- python copy和deepcopy
Python FAQ2:赋值.浅拷贝.深拷贝的区别? 发表于 2014-08-15 | 分类于 Lang.-Python | 在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷 ...
- [Python] 等号赋值, copy, deepcopy的区别
参考链接: 1. 介绍python中的可变类型与不可变类型:https://blog.csdn.net/answer3lin/article/details/86430074 (也可以参考转载博客 P ...
- python copy与deepcopy (拷贝与深拷贝)
copy与deepcopy python 中的copy与deepcopy是内存数据的操作,但是两个函数有一定的区别. 1.copy import copy list = [1, [4, 5, 6], ...
- Python面试题之copy/deepcopy详解
copy和deepcopy有什么区别? http://blog.csdn.net/qq_32907349/article/details/52190796 http://iaman.actor/blo ...
随机推荐
- 利用Nginx轻松实现Ajax的跨域请求(前后端分离开发调试必备神技)
利用Nginx轻松实现浏览器中Ajax的跨域请求(前后端分离开发调试必备神技) 前言 为什么会出现跨域? 造成跨域问题的原因是因为浏览器受到同源策略的限制,也就是说js只能访问和操作自己域下的资源,不 ...
- 中断描述符表 IDT
保护模式下三个重要的系统表——GDT.LDT和IDT 这里主要是解释中断描述符表 中断描述符表IDT将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT表类似,IDT也是由8字节长描述符 ...
- How To Install Nginx on CentOS 7(转)
How To Install Nginx on CentOS 7 PostedJuly 22, 2014 427.4kviews NGINX CENTOS About Nginx Nginx is a ...
- 给没有id主键的表添加id,并设置为not null 然后填充自增id
买的ip数据库,表上不带id 使用hibernate比较麻烦,所以直接改表 增加一个字段id,类型int ALTER TABLE t_ip ADD id int; 设置id不为空设置为主键,自增 AL ...
- [jnhs]全套CRC校验 算法
摘自 https://blog.csdn.net/cp1300/article/details/51443350 uint8_t crc4_itu(uint8_t *data, uint_len le ...
- 为啥Spring和Spring MVC包扫描要分开
开始学习springmvc各种小白问题 根据例子配置了spring扫描包,但是一直提示404错误,经过大量搜索,发现,扫描包的配置应该写在springmvc的配置文件中,而不是springmvc 配置 ...
- 【NOJ2024】入栈序列和出栈序列
入栈序列和出栈序列 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 总提交:293 测试通过:68 比赛描述 给出入栈序列 ...
- 高可用服务 AHAS 在消息队列 MQ 削峰填谷场景下的应用
在消息队列中,当消费者去消费消息的时候,无论是通过 pull 的方式还是 push 的方式,都可能会出现大批量的消息突刺.如果此时要处理所有消息,很可能会导致系统负载过高,影响稳定性.但其实可能后面几 ...
- Vue--公有组件以及组件的使用和特点
组件的作用:为了能够让功能与功能之间互不影响,使代码更加清晰整洁 1 <!DOCTYPE html> <html lang="en"> <head&g ...
- 【Mobius绮丽的辗转】莫比乌斯反演
Problem 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 1≤n≤50000,1≤a≤b≤5 ...