Python学习笔记之浅拷贝和深拷贝

原创 2017年07月15日 07:32:15

在python中对象的复制有三种一般的复制,浅拷贝,深拷贝,那么他们有什么区别呢

一般的复制

#encoding:utf-8
#定义一个嵌套集合
lista=[1,2,3,[4,5,6,[7,8,9]]]

listb=lista
#分别打印出 lista和listb的地址值
print id(lista) #4511103096
print id(listb) #4511103096

#修改lista中的内容,listb中的内容也会跟着修改

lista[0]=0
print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]
print listb #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]

通过以上实践会发现,复制操作就是将lista在内存中指向的地址,也让listb指向他,本身并没有在内存中创建地址。

浅拷贝

#encoding:utf-8
#定义一个嵌套集合
import copy
lista=[1,2,3,[4,5,6,[7,8,9]]]
#使用copy模块中copy方法
listb=copy.copy(lista)

print id(lista) #4396231640

print id(listb) #4396231712

#发现lista和listb在内存中的地址有区别,
#打印元素中的第一个元素的地址值
print id(lista[0])#140666751466536

print id(listb[0])#140666751466536

#元素的地址值是一样的,是不是意思就是,改变lista中的第一个元素,
# listb中的也要改变呢

lista[0]=0

print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]

print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]

#结果发现,竟然没有跟着lista一起改变,为什么呢,因为使用了浅拷贝呗
#我们在打印下lista[0]和listb[0]的地址
print id(lista[0])  #140666751466560

print id(listb[0])  #140666751466536

#会发现lista[0]重新指向内存中的其他地址


#这时候可以通过以上的方法,修改lista[3],lista[3]也是一个list

print id(lista[3])#4499779240

print id(listb[3])#4499779240

#修改lista[3]中第一个元素呢

lista[3][0]=0

print lista #[0, 2, 3, [0, 5, 6, [7, 8, 9]]]

print listb #[0, 2, 3, [0, 5, 6, [7, 8, 9]]]

#发现修改lista[3][0]元素的值,listb[3][0]也会跟着改变

根据以上实践说明,浅拷贝对对象中对象没有拷贝。

深拷贝

    #encoding:utf-8
    #定义一个嵌套集合
    import copy
    lista=[1,2,3,[4,5,6,[7,8,9]]]

    #深拷贝功能是在浅拷贝上做的加强,所以具备浅拷贝的功能
    listb=copy.deepcopy(lista)

    lista[3][0]=0

    print lista #[1, 2, 3, [0, 5, 6, [7, 8, 9]]]

    print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]

    #深拷贝会解决修改lista[3][0]值不会影响listb中的值

    #再来修改下第三层列表中元素是不是也完成拷贝

    lista[3][3][0]=0

    print lista  #[1, 2, 3, [0, 5, 6, [0, 8, 9]]]

    print listb  #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]

    #没有受到任何影响
版权声明:本文为博主原创文章,未经博主允许不得转载。

python整理二十五——谈谈浅拷贝与深拷贝

python中的浅拷贝深拷贝的概念和C++里面的浅拷贝深拷贝是一样的。所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝,边看例子边解释: #1>>> ls1 = [1,2,3,4,5]>>...
  • hong201
  • hong201
  • 2009年04月26日 23:31
  • 11190

关于Python中深拷贝与浅拷贝的理解(一)---概念

缘由 用Python也有很长时间了,一直在做科学计算和爬虫采集方面的东西。自己的毕业论文涉及到编写一个科学计算的软件,也是用Python编写。界面采用PyQt。 软件的主体前段时间已经写好,最近在试算...
  • u014433413
  • u014433413
  • 2015年11月10日 20:15
  • 3073

Python 赋值、浅拷贝、深拷贝的区别?

http://songlee24.github.io/2014/08/15/python-FAQ-02/ 在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念...
  • yugongpeng_blog
  • yugongpeng_blog
  • 2015年06月23日 12:20
  • 3582

Python中深拷贝与浅拷贝的区别:

Python中深拷贝与浅拷贝的区别:
  • u014745194
  • u014745194
  • 2017年04月20日 16:58
  • 551

opencv浅拷贝与深拷贝

1、当我将摄像头捕获到的的一帧图片赋值给srcImage时,如下所示: *videoCap >> srcImage; 2、在不同时刻取出两张图 Mat_imageL = srcImage; ...
  • u012283902
  • u012283902
  • 2015年10月25日 22:51
  • 463

$.extend中探索深拷贝和浅拷贝

网上这方面的教程比较多,由于上次看了篇错误的教程搞得我迷糊;特意写下这篇笔记,若文中有错误之处,忘路过的朋友及时指出,不想祸害其他朋友了; 首先说明下:深拷贝(深复制)和浅拷贝(浅复制),特地说明怕...
  • u012475786
  • u012475786
  • 2017年05月26日 17:21
  • 364

c++深拷贝和浅拷贝

C++中类的拷贝有两种:深拷贝,浅拷贝当出现类的等号赋值时,会调用拷贝函数 在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅...
  • u010700335
  • u010700335
  • 2014年10月06日 19:27
  • 1776

深拷贝和浅拷贝的理解与应用

深拷贝和浅拷贝的理解与应用 对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的部分或全部...
  • u014628388
  • u014628388
  • 2017年08月22日 23:55
  • 363

C++ 深拷贝 与 浅拷贝

本文分三部分阐释深拷贝于浅拷贝,着眼点主要还是在深拷贝。第一部分讲述为什么会有拷贝,即对象之间的复制。第二部分讲述为什么会有深拷贝于浅拷贝,即类成员存在资源分配。第三部分阐释深拷贝于浅拷贝的定义与使用...
  • u013630349
  • u013630349
  • 2015年06月01日 22:33
  • 967

图解Python深拷贝和浅拷贝

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。 下面本文就通过简单的例子介绍一下这些概念之间的差别。 对象赋值 直接看一段代码: ...
  • IT_YUAN
  • IT_YUAN
  • 2016年08月26日 14:33
  • 846
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python学习笔记之浅拷贝和深拷贝
举报原因:
原因补充:

(最多只允许输入30个字)