python 的浅拷贝: b=copy.copy(a)
python 的深拷贝: b=copy.deepcopy(a)
1: 赋值不会发生复制,会影响原数据
import numpy as np
a = np.arange(6)
print('我们的数组是:', a) # 我们的数组是: [0 1 2 3 4 5]
print('调用 id() 函数:', id(a)) # 调用 id() 函数: 140526644449648
b = a
print('\na 赋值给 b:', b) # a 赋值给 b: [0 1 2 3 4 5]
print('b 拥有相同 id():', id(b)) # b 拥有相同 id(): 140425744387968
b.shape = 3, 2
print('\n修改 b 的形状:')
print(b)
# 修改 b 的形状:
# [[0 1]
# [2 3]
# [4 5]]
print('\na 的形状也修改了:')
print(a)
# a 的形状也修改了:
# [[0 1]
# [2 3]
# [4 5]]
2: 切片会复制,也会影响原数据
import numpy as np
arr = np.arange(12)
print('我们的数组:', arr) # 我们的数组: [ 0 1 2 3 4 5 6 7 8 9 10 11]
print('\n---- 创建切片,并修改切片的值 ----')
a = arr[3:]
b = arr[3:]
a[1] = 123
print(a) # [ 3 123 5 6 7 8 9 10 11]
b[2] = 234
print(a) # [ 3 123 234 6 7 8 9 10 11]
print(b) # [ 3 123 234 6 7 8 9 10 11]
print('数组arr会随之改变:', arr) # 数组arr会随之改变: [ 0 1 2 3 123 234 6 7 8 9 10 11]
print("a,b 的id是不同的:", id(a), id(b), id(arr[3:])) # a,b 的id是不同的: 140699010952768 140699010952528 140699016116784
# 变量 a,b 都是 arr 的一部分视图,对视图的修改会直接反映到原数据中。
# 但是我们观察 a,b 的 id,他们是不同的,
# 也就是说,视图虽然指向原数据,但是他们和赋值引用还是有区别的。
3: 浅拷贝 与 深拷贝
import copy
a=[1,2,3,4,5,['a','b']] #原始对象
b=a#赋值,传对象的引用
c=copy.copy(a)#对象拷贝,浅拷贝
d=copy.deepcopy(a)#对象拷贝,深拷贝
print ("a=",a," id(a)=",id(a),"id(a[5])=",id(a[5]))
print ("b=",b," id(b)=",id(b),"id(b[5])=",id(b[5]))
print ("c=",c," id(c)=",id(c),"id(c[5])=",id(c[5]))
print ("d=",d," id(d)=",id(d),"id(d[5])=",id(d[5]))
a.append(6)#修改对象a
a[5].append('c')#修改对象a中的['a','b']数组对象
print("a=",a," id(a)=",id(a),"id(a[5])=",id(a[5]))
print("b=",b," id(b)=",id(b),"id(b[5])=",id(b[5]))
print("c=",c," id(c)=",id(c),"id(c[5])=",id(c[5]))
print("d=",d," id(d)=",id(d),"id(d[5])=",id(d[5]))
从程序的结果来看,列表a和b是赋值操作,两个对象完全指向同一个地址,a和b就是同一块地址的两个引用,其实就是一个东西,所以一个对象在修改浅层元素或深层元素时,另一个对象也同时在变;
- 深层元素为不可变元素
- 浅层元素为可变元素
c是a进行浅拷贝生成的对象,可以看到a(或b)和c两个对象整体的id是不同的,但是里面的第5个元素-列表的地址却是相同的(指向同一个地址),所以b在浅层次元素层面(不可变)增加一个元素时,c并没跟着增加,但是b的第5个元素-列表在增加一个元素时,c的第5个元素也跟着增加了,这就是因为b和c的第5个元素-列表是指向同一个地址的,这个地址上的值变了,在两个地方会同时改变;
再看d,d的浅层次元素(不可变)和 深层次元素(可变)的地址和a,b,c都不一样,所以,a,b,c无论怎么修改,d都不会跟着改变,这就是深拷贝的结果。
reference:
https://www.cnblogs.com/xiaxiaoxu/p/9742452.html