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) #对象拷贝,浅拷贝 ...
随机推荐
- UVa 10294 Arif in Dhaka (First Love Part 2) (Polya定理)
题意:给定 n 和 m 表示要制作一个项链和手镯,项链和手镯的区别就是手镯旋转和翻转都是相同的,而项链旋转都是相同的,而翻转是不同的,问你使用 n 个珠子和 m 种颜色可以制作多少种项链和手镯. 析: ...
- Day1-python基础-变量常量
不积跬步无以至千里 补充上一节字符串的内容: 字符串格式化输出: name = input("name>>") print("My name is %s&qu ...
- C#-VS SQLServer数据库编程-摘
ado.net 通用类对象.在本地内存暂存数据 托管类对象.让本地通用类对象连接数据库,让本地通用类对象和数据库同步 连接数据库 new connection(connectstring) comma ...
- 关于memcached
代振军 http://www.cnblogs.com/daizhj/archive/2009/03/23/1386652.html http://www.cnblogs.com/daizhj/arch ...
- Mysql逻辑分层、存储引擎
Mysql的逻辑分层: 连接层 服务层 引擎层 存储层 常见的数据库引擎有InnorDB和MylSAM. InnorDB:事物优先,(适合高并发操作:行锁,顾名思义一次锁一行数据) MylSAM:性能 ...
- poj3061
#include<stdio.h> #include<iostream> using namespace std; #include<algorithm> cons ...
- ASP.NET Web API 框架研究 Web Host模式下的消息处理管道
寄宿的作用是开启一个进程为Web API提供一个运行环境以解决持续监听.请求监听和响应回复,即将接收到的请求转换成HttpRequestMessage对象传入管道,并将管道生成并经过处理后的HttpR ...
- Mysql 分区(range,list,hash)转载
MySQL支持RANGE,LIST,HASH和KEY四种分区.其中,每个分区又都有一种特殊的类型.对于RANGE分区,有RANGE COLUMNS分区.对于LIST分区,有LIST COLUMNS分区 ...
- Android-WebView与本地HTML (互调)
此篇博客是基于,上两篇博客,Android-WebView与本地HTML (HTML调用-->Java的方法) , Android-WebView与本地HTML (Java调用--->HT ...
- 分形之谢尔宾斯基(Sierpinski)四面体
前面讲了谢尔宾斯基三角形,这一节的将对二维三角形扩展到三维,变成四面体.即将一个正四面体不停地拆分,每个正四面体可以拆分成四个小号的正四面体.由二维转变到三维实现起来麻烦了许多.三维的谢尔宾斯基四面体 ...