python中深拷贝,浅拷贝

版权声明: https://blog.csdn.net/djs123DJS/article/details/84934120
#_author:'DJS'
#date:2018-12-09
#一个变量等于xx是指向,浅拷贝拷贝的是最顶层(拷贝的是引用而不是数据)的,深拷贝拷贝的是全部(相当于备份)
import copy
import sys
print(sys.path) #查看导入模块的先后路径
a = [1,2,3] #表示的a指向这个列表
b = [4,5,6,]
print(id(a))
print(id(b))

b.append(7)
print(b)

c = copy.deepcopy(b) #深拷贝,只拷贝数据值,不拷贝内存的地址
print(c)
print(id(c))
b.append(8)
print(b)
print(c)

##copy.copy() #浅拷贝,把xx里面的东西拷贝出来,但是数据不拷贝,直接拷贝它的指向(即引用)。
即在另外一个列表中的数据指向是不变的
浅拷贝,拷贝xx时候指向了一个新列表,列表里面的东西指向不变。只是多了一个列表,开辟多了一份
内存。浅拷贝共享的是拷贝时的数据(如a,b数据,a,b加数据的时候e里面的数据也会加),后面多加的不共享
如c里面多加一个列表,那么e不会共享c里面多加的列表
c = [a,b]
d = c
e = copy.copy(c)
# print(id(e))
# print(id(c))
print(id(c[0]))
print(id(e[0]))
a.append(66)
print(c)
print(e)


##copy.deepcopy() #深拷贝,平时用的复制属于深拷贝
c = [a,b]
d = copy.deepcopy(c)
a.append(77)
print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0])) #深拷贝的时候,开辟新的内存空间,然后拷贝数据过去。数据的指向变了。
print(c)#
print(d)#a中增加数据,但是d中没有增加
a = (2,3) #元组是不可变类型,如果copy.copy()拷贝的是元组,不是浅拷贝,因为元组是不可变类型
#所以数据是不开修改的,所以copy.copy()拷贝的是元组的时候就是指向了。不是浅拷贝了
b = copy.copy(a)
print(id(a))
print(id(b))

###如果用copy.copy()或者copy.deepcopy()对一个全部都是不可变类型(如元组,或者字符串,数字)的数据进行拷贝,那么
#他们的结果相同,都是引用指向。如果拷贝的是一个拥有不可变类型的数据(相当于元组里面有列表),即使元组时最顶层
#那么copy.deepcopy()依然是深拷贝(拷贝全部的数据,而不是指向)。而copy.copy()还是指向
#即是copy.copy()拷贝元组的时候是指向全部,拷贝列表的时候不是指向正个列表,而是创建一个新的列表
#再指向被拷贝的列表的数据。即是copy.copy()拷贝可变的数据时不能把他整个内存地址考出来
#但是拷贝不可变的数据的时候,可以把内存地(引用指向)址也拷贝了。可变的拷贝不完,不可变的可以拷贝完。
a = [1,3,2]
b = [3,4,5]

e = (a,b)
f = copy.copy(e) #浅拷贝,拷贝元组的时候照样是拷贝全部的指向。整个元组的指向
print(id(e))
print(id(f))
h = copy.deepcopy(e)#深拷贝,拷贝元组的时候
print(id(e))
print(id(h))




python中复制即引用,也可以认为是浅拷贝。

猜你喜欢

转载自blog.csdn.net/djs123DJS/article/details/84934120
今日推荐