拷贝:创建一个具有相同类型和相同值的变量,但是二者地址不同。
浅拷贝
浅拷贝:只拷贝父对象,不会拷贝内部的子对象。
import copy
a = [1, 2, 3]
print("a存储的地址为", id(a))
print("a第一个元素存储的地址为", id(a[0]))
print("a第二个元素存储的地址为", id(a[1]))
b = copy.copy(a)
print("b存储的地址为", id(b))
print("b第一个元素存储的地址为", id(b[0]))
print("b第二个元素存储的地址为", id(b[1]))
输出结果:
a存储的地址为 4489746056
a第一个元素存储的地址为 4486829120
a第二个元素存储的地址为 4486829152
b存储的地址为 4489746248
b第一个元素存储的地址为 4486829120
b第二个元素存储的地址为 4486829152
b是由a浅拷贝得到的对象,a和b拥有不同的地址,但是a和b的每个元素仍然拥有相同的地址。由于浅拷贝没有拷贝子对象,假如更改可变类型的子对象,则会导致拷贝对象也随之发生改变。
import copy
a = [[100, 200], 2, 3]
b = copy.copy(a)
a[0].append(300) # 更改a[0]为可变类型对象,a[0]更改前后没有改变地址, b[0]和a[0]始终指向同一地址
print("a=", a)
print("b=", b)
输出结果:
a= [[100, 200, 300], 2, 3]
b= [[100, 200, 300], 2, 3]
假如更改的子对象为不可变类型对象,则拷贝对象的子对象和原对象的子对象地址发生改变,拷贝对象不会发生改变。
import copy
a = [[100, 200], 2, 3]
b = copy.copy(a)
a[2] = 500 # a[2]更改前后改变了地址, b[2]地址没有改变
print("a=", a)
print("b=", b)
深拷贝
深拷贝:同时拷贝父对象和子对象。新拷贝的对象开拓一块内存空间,无论原对象如何进行操作都不会改变拷贝对象。
import copy
a = [[100, 200], 2, 3]
b = copy.deepcopy(a)
a[0].append(300)
a[2] = 500
print("a=", a)
print("b=", b)
输出结果:
a= [[100, 200, 300], 2, 500]
b= [[100, 200], 2, 3]