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的差别的更多相关文章

  1. 从python中copy与deepcopy的区别看python引用

    讨论copy与deepcopy的区别这个问题要先搞清楚python中的引用.python的内存管理. python中的一切事物皆为对象,并且规定参数的传递都是对象的引用.可能这样说听起来比较难懂,对比 ...

  2. python中copy()和deepcopy()详解

    **首先直接上结论: —–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以改变原有被复制对象不会对已经复制出来的新对象产生影响.—–而浅复制并不会产生一个独立的 ...

  3. python中copy与deepcopy的区别

    目录 区别 python代码举例 区别 高级语言中变量是对内存及其地址的抽象 copy.copy(object), 拷贝的是内嵌套结构的地址引用,当前到结构发生变化的时候,浅拷贝也相应的改变. cop ...

  4. python中copy 与 '=' 的区别

    当你a=1000的时候a指向一个新的类,内容为1000,而b仍然指向原来指向的内容,因为你没有叫它指向其他内容.你使用=符号,使得a和b指向同一个内容,而copy则是将b的内容复制后让c指向这个拷贝的 ...

  5. python中is与==的差别

    # is:比较的是两个对象的id值是否相等,# 也就是比较俩对象是否为同一个实例对象,# 是否指向同一个内存地址 # s = "alex"# abc = id(s) # 得到内存地 ...

  6. Python中=、copy、deepcopy

    一.Python中的"=" a = 1 b = 1 c = a print(id(a)) print(id(b)) print(id(c)) #输出为 14070784103734 ...

  7. Python中的Copy和Deepcopy

    一,Python的对象: Python存在大量的对象,我们一般提到的对象都是C中的结构体在堆中申请的一块内存(以CPython为例),每一个对象都有ID,可以通过ID(Object)获得.对象的范围包 ...

  8. 深入理解Python中赋值、深拷贝(deepcopy)、浅拷贝(copy)

    赋值 python跟java中的变量本质是不一样的,Python的变量实质上是一个指针(int型或str型),而java的变量是一个可操作的存储空间. a = 123b = a print(id(a) ...

  9. python中的copy.copy和copy.deepcopy

    一个例子就搞清楚 import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷贝 ...

随机推荐

  1. matlab中的结构体

    今天用imfinfo函数 >> K = imfinfo(‘colorbar_copy1.jpg’) K = 包含以下字段的 struct: Filename: 'E:\matlab\col ...

  2. linux之vim配置及使用示例

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7056193.html linux之vim配置及使用示例 vi的三种模式: 一 ...

  3. day37(类加载器)

    类的加载器:将class文件加载到JVM中执行这个文件. Java中将类加载器分成三类: 引导类加载器:     JAVA_HOME/jre/lib/rt.jar | 扩展类加载器:     JAVA ...

  4. java静态代码块、普通代码

    参考文章:http://www.cnblogs.com/qinpengming/p/5227227.html Java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的 ...

  5. LigerUi中为Grid表加上序号,并调整适当宽度!(实例)

    LigerUi中为Grid表加上序号,并调整适当宽度!(实例) dataAction: 'server', pageSize: 20, toolbar: {},           url: 'ndl ...

  6. CentOS下下载软件,不安装的方法

    今天来说下在CentOS下下载软件,不安装的方法: 方法一:通过yum自带一个工具:yumdownloader[root@web1 ~]#  rpm -qa |grep yum-utils[root@ ...

  7. how can I make the login form transparent?

    This is how you can make the Login Form transparent: 1. Add this css to Server Module-> Custom cs ...

  8. FastReport使用技巧

    使用技巧篇 1.FastReport中如果访问报表中的对象?       可以使用FindObject方法.      TfrxMemoView(frxReport1.FindObject('memo ...

  9. Delphi7调用DelphiXE编写的DLL问题

    http://bbs.csdn.net/topics/380045353 用DelphiXE在WIN2008下编写一个访问WebServices的DLL ws.dll,只有一个输出函数,如下: fun ...

  10. CAS Ticket票据:TGT、ST、PGT、PT、PGTIOU

    CAS的核心就是其Ticket,及其在Ticket之上的一系列处理操作.CAS的主要票据有TGT.ST.PGT.PGTIOU.PT,其中TGT.ST是CAS1.0协议中就有的票据,PGT.PGTIOU ...