Python3基础之(三十)深拷贝和浅拷贝

版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/PoGeN1/article/details/84193200

首先请先看一下我之前写的一篇文章 深拷贝与浅拷贝的区别
Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。

一、id

深拷贝和浅拷贝最大的区别就在于占用内存的不同,所以首先要知道怎么查看对象的地址。一个对象的id值在CPython解释器里就代表它在内存中的 地址

>>> import copy
>>> a=[1,2,3]
>>> b=a
>>> id(a)
2090106460936
>>> id(b)
2090106460936
>>> id(a)==id(b)
True
>>> b[0]=22222
>>> print(a,b)
[22222, 2, 3] [22222, 2, 3]

上例中可以看出b=a操作的结果是:ab的地址是同一块内存,改变b的值,a的值也会跟着改变。实际上a和b都是内存地址为:2090106460936的内存一个引用(也就是c语言中常说的指针)

二、浅拷贝copy.copy

当使用浅拷贝时,python只是拷贝了最外围的对象本身(对象本身的地址变了),内部的元素都只是拷贝了一个引用而已(内部元素的地址没有改变)。看代码:

>>> import copy
>>> a=[1,2,3]
>>> c=copy.copy(a)  #拷贝了a的外围对象本身,
>>> id(c)
4383658568
>>> print(id(a)==id(c))  #id 改变 为false
False
>>> c[1]=22222   #此时,我去改变c的第二个值时,a不会被改变。
>>> print(a,c)
[1, 2, 3] [1, 22222, 3] #a值不变,c的第二个值变了,这就是copy和‘==’的不同

三、深拷贝copy.deepcopy

deepcopy对外围内部元素都进行了拷贝对象本身,而不是拷贝对象的引用。可以理解为深拷贝就是完全拷贝,浅拷贝就是不完全拷贝。

#copy.copy()

>>> a=[1,2,[3,4]]  #第三个值为列表[3,4],即内部元素
>>> d=copy.copy(a) #浅拷贝只是拷贝a中的1,2,[3,4]这些内部元素的引用,而非内部元素对象的本身
>>> id(a)==id(d)#只是拷贝了对象本身,而非内部元素对象本身
False
>>> id(a[2])==id(d[2])#内部元素只是拷贝了引用
True
>>> id(a[1])==id(d[1])
True
>>> a[2][0]=3333  #改变a中内部原属列表中的第一个值
>>> d             #这时d中的列表元素也会被改变
[1, 2, [3333, 4]]


#copy.deepcopy()

>>> e=copy.deepcopy(a) #e为深拷贝了a
>>> a[2][0]=333 #改变a中内部元素列表第一个的值
>>> e
[1, 2, [3333, 4]] #因为时深拷贝,这时e中内部元素[]列表的值不会因为a中的值改变而改变
>>>

猜你喜欢

转载自blog.csdn.net/PoGeN1/article/details/84193200
今日推荐