python中 =、copy、deepcopy的差别
python2中,需要import copy模块
python3中,直接可以使用copy()方法,但deepcopy()还是需要导入copy模块
下面以python2为例:
对于"=":
#-*- coding:utf-8 -*-
import copy
l1=[1,[2,3]]
l2=[1,[2,3]]
l3=l1
#查看l1、l2、l3各自的地址
print id(l1),id(l2),id(l3) #139826875107232 139826875255192 139826875107232 print id(l1[0]),id(l1[1]) #14786904 139677954645024
print id(l2[0]),id(l2[1]) #14786904 139677954645024
print id(l3[0]),id(l3[1]) #14786904 139677954645024
l1[0]+=1
l1[1].append(4)
print id(l1[0]),id(l1[1]) #14786880 139677954645024
print id(l2[0]),id(l2[1]) #14786904 139677954645024
print id(l3[0]),id(l3[1]) #14786880 139677954645024 print l1,l2,l3 #[2, [2, 3, 4]] [1, [2, 3]] [2, [2, 3, 4]]
通过以上可以发现,利用=进行赋值的话,两个list是完全相同的,共享同一个地址上的list,对其中一个list进行任何操作,两个list都会变化。红色的地方表明,一开始所有的list都在同一地址,这是为什么,这里可以参考:python可变对象与不可变对象的差别
对于“copy”:
#-*- coding:utf-8 -*-
import copy
l1=[1,[2,3]]
l2=copy.copy(l1) print id(l1),id(l2)#140244454279072 140244454426744
print l1,l2 #[1, [2, 3]] [1, [2, 3]] l1.append(3)
print id(l1),id(l2)#140244454279072 140244454426744
print l1,l2 #[1, [2, 3], 3] [1, [2, 3]] l2.append(5)
print id(l1),id(l2)#140244454279072 140244454426744
print l1,l2 #[1, [2, 3], 3] [1, [2, 3], 5] '''-------------------------------------------------------'''
print id(l1[0]),id(l1[1]),id(l1[2])#28721496 140537829112864 28721448
print id(l2[0]),id(l2[1]),id(l2[2])#28721496 140537829112864 28721400 l1[1].append(4)
print id(l1[0]),id(l1[1]),id(l1[2])#12296536 139992916270112 12296488
print id(l2[0]),id(l2[1]),id(l2[2])#12296536 139992916270112 12296440
print l1,l2 #[1, [2, 3, 4], 3] [1, [2, 3, 4], 5] l2[1].remove(2)
print id(l1[0]),id(l1[1]),id(l1[2])#41783640 140604104870944 41783592
print id(l2[0]),id(l2[1]),id(l2[2])#41783640 140604104870944 41783544
print l1,l2 #[1, [3, 4], 3] [1, [3, 4], 5] l2.remove(1)
print id(l1[0]),id(l1[1]),id(l1[2])#14700888 139644594265120 14700840
print id(l2[0]),id(l2[1])#139644594265120 14700792
print l1,l2 #[1, [3, 4], 3] [[3, 4], 5]
可以看到,一开始l2和l1的地址就是不相同的,但是一开始他们的子list,也就是l1[1]、l2[1]的地址一直是相同的,l2[1]与l1[1]会因为彼此变化而变化,也就是说,copy下,list的第一层不会因为彼此的改变而改变,但是子list还是会互相连动。
对于"deepcopy":
#-*- coding:utf-8 -*-
import copy
l1=[1,[2],[3,[4]]]
l2=copy.deepcopy(l1) print l1,l2 #[1, [2], [3, [4]]] [1, [2], [3, [4]]]
print id(l1[0]),id(l1[1]),id(l1[2]) #42979672 140054670666784 140054670805184
print id(l2[0]),id(l2[1]),id(l2[2]) #42979672 140054670805544 140054670805760 l1[1].append(11)
print l1,l2 #[1, [2, 11], [3, [4]]] [1, [2], [3, [4]]]
print id(l1[0]),id(l1[1]),id(l1[2]) #42979672 140054670666784 140054670805184
print id(l2[0]),id(l2[1]),id(l2[2]) #42979672 140054670805544 140054670805760 l1[2][1].append(11)
print l1,l2 #[1, [2, 11], [3, [4, 11]]] [1, [2], [3, [4]]]
print id(l1[0]),id(l1[1]),id(l1[2]) #42979672 140054670666784 140054670805184
print id(l2[0]),id(l2[1]),id(l2[2]) #42979672 140054670805544 140054670805760 l2[2][1].append(11)
print l1,l2 #[1, [2, 11], [3, [4, 11]]] [1, [2], [3, [4, 11]]]
print id(l1[0]),id(l1[1]),id(l1[2]) #42979672 140054670666784 140054670805184
print id(l2[0]),id(l2[1]),id(l2[2]) #42979672 140054670805544 140054670805760
可以发现,deepcopy下的两个list是完全不一样的两个list,互相的操作,互不影响。注意:这里可以看到,deepcopy是重新开辟了一块内存赋予给新的list,当数据很大会很占用内存。
python中 =、copy、deepcopy的差别的更多相关文章
- 从python中copy与deepcopy的区别看python引用
讨论copy与deepcopy的区别这个问题要先搞清楚python中的引用.python的内存管理. python中的一切事物皆为对象,并且规定参数的传递都是对象的引用.可能这样说听起来比较难懂,对比 ...
- python中copy()和deepcopy()详解
**首先直接上结论: —–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以改变原有被复制对象不会对已经复制出来的新对象产生影响.—–而浅复制并不会产生一个独立的 ...
- python中copy与deepcopy的区别
目录 区别 python代码举例 区别 高级语言中变量是对内存及其地址的抽象 copy.copy(object), 拷贝的是内嵌套结构的地址引用,当前到结构发生变化的时候,浅拷贝也相应的改变. cop ...
- python中copy 与 '=' 的区别
当你a=1000的时候a指向一个新的类,内容为1000,而b仍然指向原来指向的内容,因为你没有叫它指向其他内容.你使用=符号,使得a和b指向同一个内容,而copy则是将b的内容复制后让c指向这个拷贝的 ...
- python中is与==的差别
# is:比较的是两个对象的id值是否相等,# 也就是比较俩对象是否为同一个实例对象,# 是否指向同一个内存地址 # s = "alex"# abc = id(s) # 得到内存地 ...
- Python中=、copy、deepcopy
一.Python中的"=" a = 1 b = 1 c = a print(id(a)) print(id(b)) print(id(c)) #输出为 14070784103734 ...
- Python中的Copy和Deepcopy
一,Python的对象: Python存在大量的对象,我们一般提到的对象都是C中的结构体在堆中申请的一块内存(以CPython为例),每一个对象都有ID,可以通过ID(Object)获得.对象的范围包 ...
- 深入理解Python中赋值、深拷贝(deepcopy)、浅拷贝(copy)
赋值 python跟java中的变量本质是不一样的,Python的变量实质上是一个指针(int型或str型),而java的变量是一个可操作的存储空间. a = 123b = a print(id(a) ...
- python中的copy.copy和copy.deepcopy
一个例子就搞清楚 import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷贝 ...
随机推荐
- SpringBoot初探
一:项目创建 个人用的是IDEA来做Demo的: 1.先创建一个空项目,然后创建一个基于Maven的java application项目: 2.创建好后配置pom.xml文件并最终reimport & ...
- 学以致用十四-----打造一个简单的vim IDE
一.安装dircolors git clone https://github.com/seebi/dircolors-solarized.git cd dircolors-solarized/ mv ...
- 5、Makefile基础知识汇总(转自陈皓总述)
一.Makefile里有什么? Makefile里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 1.显式规则.显式规则说明了,如何生成一个或多的的目标文件.这是由Makefile ...
- hdu 1541
因为y的输入是从小到大,所以不用考虑y坐标的问题 只考虑x坐标就行 还有个小细节就是0<=x,y,<=32000 x和y取0的时候树状数组处理不到 x++就行了 #include < ...
- Scala_基本语法
基本语法 声明值和变量 Scala有两种类型的变量: val:是不可变的(变量的引用不可变),在声明时就必须被初始化,而且初始化以后就不能再赋值: var:声明的时候需要进行初始化,初始化以还可以再对 ...
- oracle数据库 ORA-01017的解决办法
alter user 用户名 identified by 新密码:
- shell 中的 && 和 ||
shell 中的 && 和 || 简言之,shell 中 && --左边的命令执行成功才会执行右边的命令. || -- 左边的命令执行失败才会执行右边的命令.
- Android-Kotlin-函数表达式&String与Int转换$异常处理
Kotlin的函数表达式: package cn.kotlin.kotlin_base03 /** * 函数第一种写法 */ fun addMethod1(number1: Int, number2: ...
- AFNetworking 3.0 AFHTTPSessionManager文件下载
#import "ViewController.h" #import <AFNetworking.h> @interface ViewController () - ( ...
- asp.net core mvc 中间件之路由
asp.net core mvc 中间件之路由 路由中间件 首先看路由中间件的源码 先用httpContext实例化一个路由上下文,然后把中间件接收到的路由添加到路由上下文的路由集合 然后把路由上下文 ...