Python——深拷贝和浅拷贝
深拷贝、浅拷贝
1. 浅拷贝
浅拷贝是对于一个对象的顶层拷贝
import copy a = [[1, 2], 3]
b = copy.copy(a)
print(id(a))
print(id(b))
print(id(a[0]))
print(id(b[0]))
print(id(a[1]))
print(id(b[1])) a[0].append(1)
print(a)
print(b)
输出结果:
2249583452872
2250135748552
2249583452808
2249583452808
140714232963984
140714232963984
[[1, 2, 1], 3]
[[1, 2, 1], 3]
copy()是浅拷贝,只拷贝了最顶层的数组,而数组中的内容只是拷贝了引用。
因此用a[0].append(1)方法后,数组a和b都发生了改变。
2. 深拷贝
深拷贝是对于一个对象所有层次的拷贝(递归)
import copy a = [[1, 2], 3]
b = copy.deepcopy(a)
print(id(a))
print(id(b))
print(id(a[0]))
print(id(b[0])) a[0].append(1)
print(a)
print(b)
输出结果:
1931836547784
1932360400776
1931836547720
1931837818120
[[1, 2, 1], 3]
[[1, 2], 3]
deepcopy()是深拷贝,不仅拷贝最顶层的数组,数组里的内容也拷贝了,这里不同于拷贝引用,而是创建了新的地址空间,存放的内容和原数组相同。因此这次用a[0].append(1)后,b数组没有发生变化。
3.拷贝的其他方式
分片拷贝浅拷贝
import copy a = [[1, 2], 3]
b = a[:]
print(id(a))
print(id(b))
print(id(a[0]))
print(id(b[0]))
print(id(a[1]))
print(id(b[1])) a[0].append(1)
print(a)
print(b)
输出结果:
2672287769288
2672811617864
2672287769224
2672287769224
140714232963984
140714232963984
[[1, 2, 1], 3]
[[1, 2, 1], 3]
可见:分片拷贝是浅拷贝。
字典的copy()方法
d = dict(name='xiaoming', friend=['xiaohong', 'xiaoying']) c = d.copy() print(d)
print(c) print(id(d))
print(id(c)) print(id(d['name']))
print(id(c['name'])) print(id(d['friend']))
print(id(c['friend'])) d['friend'].append('lisa') print(d)
print(c)
结果:
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying']}
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying']}
2175018372336
2175021103360
2175021498672
2175021498672
2175017902728
2175017902728
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying', 'lisa']}
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying', 'lisa']}
可见,字典的copy()方法也是浅拷贝。
4.注意
copy()和deepcopy()对于不包含可变类型数据的元组,只会拷贝引用
import copy d = (1, 2, 3) c = copy.copy(d)
b = copy.deepcopy(d) print(id(d))
print(id(c))
print(id(b))
结果:
1959295969464
1959295969464
1959295969464
当deepcopy()对于包含可变类型数据的元组时,才会拷贝整个元组的内容
import copy d = (1, 2, [1,2,3]) c = copy.copy(d)
b = copy.deepcopy(d) print(id(d))
print(id(c))
print(id(b))
结果:
2774011472056
2774011472056
2774011384024
Python——深拷贝和浅拷贝的更多相关文章
- python 深拷贝与浅拷贝
浅拷贝的方式有: lst=[1,2,3] (1)直接赋值: lst_cp = lst (2)for循环遍历生成:lst_cp= [i for i in lst] (3)copy模块下,copy.cop ...
- Python深拷贝和浅拷贝
1- Python引用计数[1] 1.1 引用计数机制 引用计数是计算机编程语言中的一种内存管理技术,是指将资源(可以是对象.内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的 ...
- 【python测试开发栈】—理解python深拷贝与浅拷贝的区别
内存的浅拷贝和深拷贝是面试时经常被问到的问题,如果不能理解其本质原理,有可能会答非所问,给面试官留下不好的印象.另外,理解浅拷贝和深拷贝的原理,还可以帮助我们理解Python内存机制.这篇文章将会通过 ...
- Python深拷贝与浅拷贝区别
可变类型 如list.dict等类型,改变容器内的值,容器地址不变. 不可变类型 如元组.字符串,原则上不可改变值.如果要改变对象的值,是将对象指向的地址改变了 浅拷贝 对于可变对象来说,开辟新的内存 ...
- Python 深拷贝和浅拷贝的区别
python的复制,深拷贝和浅拷贝的区别 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 ...
- python深拷贝和浅拷贝的区别
首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别. 什么是可变对象,什么是不可变对象: 可变对象 ...
- PYTHON 深拷贝,浅拷贝
声明:本篇笔记,模仿与其它博客中的内容 浅拷贝 浅拷贝,在内存中只额外创建第一层数据 import copy n1 = {"k1": "wu", "k ...
- Python 深拷贝和浅拷贝
Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 对象赋值 直接看一段代码: will= ...
- Python深拷贝和浅拷贝!
在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法, alist=[1,2,3,[& ...
随机推荐
- 【总结整理】UGC内容
除了内容了产品,还有什么适合引入UGC? :引发讨论,诱导参与,然后促成销售. User Generated Content,也就是用户生成内容的意思. 购买类产品,内容催生购买 1.为用户购买提供思 ...
- iOS倒计时
现在开发基本上都有发送验证码,倒计时,下面说一种 #import <UIKit/UIKit.h> @interface UIButton (CountDown) -(void)startT ...
- freemaker 优缺点 及 应用配置
通俗的讲,freemaker其实就是一个模板引擎.什么意思呢?——Java可以基于依赖库,然后在模板上进行数据更改(显示). 在模板中,您专注于如何呈现数据,而在模板外(后台业务代码),您将专注于呈现 ...
- spring之IOC容器创建对象
1.术语了解 1.1组件/框架设计 侵入式设计 引入了框架,对现有的类的结构有影响:即需要实现或继承某些特定类. 例如: Struts框架非侵入式设计 引入了框架,对现有的类结构没有影响. 例如:Hi ...
- Video组件:控制视频的播放与暂停
来自<sencha touch权威指南>第10章,315页开始 app.js代码如下: Ext.require(['Ext.Video','Ext.MessageBox','Ext.Too ...
- 使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程
在之前的所有Spring Boot和Spring Cloud相关博文中,都会涉及Spring Boot工程的创建.而创建的方式多种多样,我们可以通过Maven来手工构建或是通过脚手架等方式快速搭建,也 ...
- java中interface使用
1.在C++中,类可以多重继承,一个类可以有好几个父类,但是在java中,类是不允许多重继承的,为了多重继承,java中出现了接口(interface)的定义.接口是可以多重继承的,接口的关键词是:i ...
- 什么是awt ?
http://docs.oracle.com/javase/6/docs/technotes/guides/awt/ Abstract Window Toolkit (AWT) The Abstrac ...
- 网络编程释疑之:单台服务器上的并发TCP连接数可以有多少
曾几何时我们还在寻求网络编程中C10K问题的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了.我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来 ...
- SSH2免密码登录OpenSSH
OpenSSH免密码登录SSH2http://blog.csdn.net/aquester/article/details/23836245 两个SSH2间免密码登录http://blog.csdn. ...