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. zk可视化工具

    也是无意中接触到zk,搞得有点头大,之前都是通过crt连通服务后,在服务上通过命令去查看节点下的数据的,十分的不方便,后来发现了可视化工具这玩意儿还真的是好用,看节啊点下的数据啥的一目了然,我用过的有 ...

  2. Oracle修改数据库的日期

    ---Oracle数据库更新时间字段数据时的sql语句---格式化时间插入 update t_invite_activityinfo set endtime=to_date('2019-10-30 1 ...

  3. 链家web前端面试

    共有三轮面试,每个面试官的第一个问题都是:介绍一个你觉着比较出彩的项目 第一轮面试: 因为公司项目没什么亮点,很传统的pc端,美女面试官就说让讲一下我用react的私人项目; 问了很多都是关于reac ...

  4. Vue、 React比较

    关键词:MVVM(Model-View-VIewModel)数据模型双向绑定.视图的数据变化会同时修改数据资源,数据资源的变化也会立刻反应到视图View上. 一.vue.js vue是一套构建用户界面 ...

  5. Kafka错误“Network is unreachable”和“larger than available brokers”

    确定Kafka安装和启动正确,ZooKeeper可以查到所有的Brokers,但执行: kafka-topics.sh --create --zookeeper localhost:2181 --re ...

  6. 第十四个目标 (fzu)

    http://acm.fzu.edu.cn/contest/problem.php?cid=151&sortid=8 Problem Description 目暮警官.妃英里.阿笠博士等人接连 ...

  7. mysql_事务

    事务是针对数据的,不是针对结构的 存储引擎innodb支持事务,myisam不支持事务需求:有一张银行账户表,有A用户给B账户转账,A账户减少,B账户增加,但是A操作之后断电. 解决方案:A减少钱,但 ...

  8. HashMap原理、源码、实践

    HashMap是一种十分常用的数据结构,作为一个应用开发人员,对其原理.实现的加深理解有助于更高效地进行数据存取.本文所用的jdk版本为1.5. 使用HashMap <Effective JAV ...

  9. Python自动化开发 - Django基础

    本节内容 一.什么是web框架 二.MVC和MTV视图 三.Django基本命令 四.路由配置系统 五.编写视图 六.Template 七.ORM 一.什么是web框架 对于所有的web应用,本质上其 ...

  10. I - Dividing Stones

    Description There are N stones, which can be divided into some piles arbitrarily. Let the value of e ...