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]]]

    #没有受到任何影响
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_31956557/article/details/75142594

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

Python中深拷贝与浅拷贝的区别:
  • u014745194
  • u014745194
  • 2017-04-20 16:58:35
  • 2974

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

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

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

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

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

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

Python拷贝对象(浅拷贝copy与深拷贝deepcopy)

先说一段废话。Python中的参数传递都是对象引用传递,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递...
  • zhangqi_gsts
  • zhangqi_gsts
  • 2016-10-22 00:17:04
  • 1090

Python的切片操作是深拷贝还是浅拷贝?

>>> a = [1,2,3, [3,4,5]] >>> b = a[:] >>> b [1, 2, 3, [3, 4, 5]] >>> a[3].append(6) >>> a [1, 2, 3, ...
  • babados
  • babados
  • 2017-10-21 18:16:32
  • 175

python 对象拷贝——浅拷贝和深拷贝 之函数传递——值传递还是引用传递?

概述: 首先,需要明白的一点是python中“没有指针,但是所有对象均为指针”。在C语言中,我们见到语句int a=8;这句话的意思是创建了一个对象a,a的值赋值为8。如果我们接下来写一句int b=...
  • trochiluses
  • trochiluses
  • 2013-11-22 11:50:15
  • 5447

图解Python深拷贝和浅拷贝

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。 下面本文就通过简单的例子介绍一下这些概念之间的差别。 对象赋值 直接看一段代码: ...
  • IT_YUAN
  • IT_YUAN
  • 2016-08-26 14:33:02
  • 1038

Python3 - 对内存的使用--深拷贝,浅拷贝

浅拷贝就是对引用的拷贝,执拷贝父对象,里面的数据不拷贝出来,其中的数据与原对象里面数据用的是相同的地址空间 深拷贝就是对对象的资源的拷贝,拷贝父对象以及里面的子对象。深拷贝把原对象独立开来,有自己的存...
  • wawa8899
  • wawa8899
  • 2016-09-05 14:56:41
  • 2472

python3 -- 列表操作 -深拷贝、浅拷贝、遍历

列表操作 -浅拷贝(copy),深拷贝1.浅拷贝(copy),深拷贝1.1 浅拷贝# coding:utf-8 # python3 -- list列表操作(拷贝copy)# 注意文件命名方式:不能 与...
  • dengwubin450
  • dengwubin450
  • 2017-02-27 10:16:50
  • 931
收藏助手
不良信息举报
您举报文章:Python学习笔记之浅拷贝和深拷贝
举报原因:
原因补充:

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