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. DOM10-1节点层次

    DOM(问的那个对象模型)是针对HTML和XML文档的API.DOM描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的一部分. 每个节点都拥有各自的特点.数据和方法,另外和其他节点也存在某种 ...

  2. python_day1_python简单介绍

    一.python解释器的种类 我们都知道python是一种解释型的语言,那python在执行的过程中必须要通过解释器来执行,那python的解释器到底分为哪些呢? 1.Cpython CPython是 ...

  3. Swift:用UICollectionView整一个瀑布流

    本文的例子和Swift版本是基于Xcode7.2的.以后也许不知道什么时候会更新. 我们要干点啥 用新浪微博的Open API做后端来实现我们要提到的功能.把新浪微博的内容,图片和文字展示在colle ...

  4. 2018-03-10 VCard备份恢复联系人

    主要在VCardComposer类中备份联系人的逻辑 导出流程: http://blog.csdn.net/michael_yt/article/details/78270537 导入流程: http ...

  5. 配置SecureCRT密钥连接Linux

    SSH公钥加密的方式使得对方即使截取了帐号密码,在没有公钥私钥的情况下,依然无法远程ssh登录系统,这样就大大加强了远程登录的安全性. 1.        编辑配置文件 /etc/ssh/sshd_c ...

  6. 17、文件IO详解及实例

    上篇文章已经讲过了文件系统的一些基本的概念,这里首先对文件IO进行详细的学习,文件IO也称为系统调用IO,是操作系统为"用户态"运行的进程和硬件交互提供的一组接口,即操作系统内核留 ...

  7. Mining Twitter Data with Python

    目录 1.Collecting data 1.1 Register Your App 1.2 Accessing the Data 1.3 Streaming 2.Text Pre-processin ...

  8. Android-HttpClient-Get与Post请求登录功能

    HttpClient 是org.apache.http.* 包中的: 第一种方式使用httpclient-*.jar (需要在网上去下载httpclient-*.jar包) 把httpclient-4 ...

  9. node-webkit学习(4)Native UI API 之window

    node-webkit学习(4)Native UI API 之window 文/玄魂 目录 node-webkit学习(4)Native UI API 之window 前言 4.1  window a ...

  10. C# if else 使物体在X轴循环移动

    if( transform.position.x > -15 && transform.rotation.y == 0 ) { //小鸟X轴反方向移动速度 transform.p ...