我们都知道,将数据赋值给某些变量,实则是将数据存储的地址引用赋值给变量,当多个变量同时引用了同一个数据地址时,改变其中一个变量,数据将会随之改变,其它引用也会改变。但在实际操作过程中,有些数据是不希望能够变化的,为了解决这个问题,引入了深浅拷贝,对于可变数据,对数据引用的地址进行拷贝
a = [1, 2]
# 赋值是引用复制
b = a
print(id(a))
print(id(b))
# 结果
# 2526284042440
# 2526284042440
浅拷贝:在内存中开辟一个空间,存放这个copy对象的内存地址,是对一个对象的顶层拷贝,拷贝了引用,并没有拷贝内容,其中的数据还是沿用之前的内存地址,因此改变原对象一维数组数据,不会影响新对象数据,改变新对象数据,不会影响原对象数据,但改变原对象中的二维数组数据,新的对象中的数据也会变化,改变新对象中的二维数组数据,原对象中的数据也会变化。可以使用copy.copy对于可变类型进行浅拷贝,但对于不可变类型,不会浅拷贝,仅仅是指向
c = [11, 22, 33]
# 复制引用
d = copy.copy(c)
print(id(c))
print(id(d))
c.append(44)
print(c)
print(d)
# 结果
# 2526283924744
# 2526283768008
# [11, 22, 33, 44]
# [11, 22, 33]
a = [1, 2]
b = [a, 3, 4, [5, 6]]
c = copy.copy(b)
a = [1, 2]
b = [a, 3, 4, [5, 6]]
c = copy.copy(b)
print(id(b))
print(id(c))
print(id(b[0]))
print((id(c[0])))
print(id(b[1]))
print(id(c[1]))
print(id(b[3]))
print(id(c[3]))
print(id(b[3][0]))
print(id(c[3][0]))
# 结果
# 2596159692872
# 2596159967688
# 2596159967368
# 2596159967368
# 140717135592576
# 140717135592576
# 2596159695240
# 2596159695240
# 140717135592640
# 140717135592640
a = [1, 2]
e = (11,a)
f = copy.copy(e)
print(id(e))
print(id(f))
print(e)
print(f)
e[1].append(3)
print(id(e[1]))
print(id(f[1]))
print(e)
print(f)
# 结果
1424684891016
1424684891016
(11, [1, 2])
(11, [1, 2])
深拷贝:在内存中开辟一个空间,将原对象及其中的可变数据重新创建一份(如果不可变对象中的数据存在可变对象,则外层不可变对象也会复制),深拷贝是递归拷贝,全部复制。不可变数据则沿用原对象的存储引用,这样对原对象中可变数据进行的操作不会影响到新的对象。使用deepcopy()执行深拷贝
a = [1, 2]
b = [a, 3, 4, (5, 6)]
c = copy.deepcopy(b)
print(id(b))
print(id(c))
print(id(b[0]))
print((id(c[0])))
print(id(b[0][0]))
print(id(c[0][0]))
print(id(b[1]))
print(id(c[1]))
print(id(b[3]))
print(id(c[3]))
print(id(b[3][0]))
print(id(c[3][0]))
# 结果
# 2700086094280
# 2700086091912
# 2700086366408
# 2700086366536
# 140717576387648
# 140717576387648
# 140717576387712
# 140717576387712
# 2700082908488
# 2700082908488
# 140717576387776
# 140717576387776
a = [11,12]
b = (a,)
c = [b]
d = copy.deepcopy(c)
print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0]))
print(id(c[0][0]))
print(id(d[0][0]))
print(id(c[0][0][0]))
print(id(d[0][0][0]))
# 结果
# 1601607510536
# 1601607508168
# 1601603823752
# 1601605518024
# 1601607782536
# 1601607663688
# 140717917568384
# 140717917568384
b = (11,)
c = [b]
d = copy.deepcopy(c)
print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0]))
print(id(c[0][0]))
print(id(d[0][0]))
# 结果
# 3075513143496
# 3075512871496
# 3075509250184
# 3075509250184
# 140717917568384
# 140717917568384