浅拷贝与深拷贝
浅拷贝
a = [1, [2, 3]]
b = copy.copy(a)
b只复制了a的引用,未复制a引用对象的引用
import copy
a = [1, [2, 3]]
b = copy.copy(a)
print(a)
print(id(a), 'a')
print(id(a[0]), 'a[0]')
print(id(a[1]), 'a[1]')
print(id(a[1][0]), 'a[1][0]')
print(id(a[1][1]), 'a[1][1]')
print(b)
print(id(b), 'b')
print(id(b[0]), 'b[0]')
print(id(b[1]), 'b[1]')
print(id(b[1][0]), 'b[1][0]')
print(id(b[1][1]), 'b[1][1]')
print('=============')
b[1][0] = 0
print(a)
print(id(a), 'a')
print(id(a[0]), 'a[0]')
print(id(a[1]), 'a[1]')
print(id(a[1][0]), 'a[1][0]')
print(id(a[1][1]), 'a[1][1]')
print(b)
print(id(b), 'b')
print(id(b[0]), 'b[0]')
print(id(b[1]), 'b[1]')
print(id(b[1][0]), 'b[1][0]')
print(id(b[1][1]), 'b[1][1]')
输出
保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5C48477%5CDesktop%5Cpython%5Cimage-20231102214039203.png&pos_id=img-nkwjJEEg-1698935085954)
易得,虽然a与b引用对象id不同,但其列表之下的引用皆相同。
若改变其中二元列表中的值,则原列表值也会改变改变一元列表的值不会出现此情况
内存情况:
b只复制了a的引用,未复制a引用对象的引用
a引用对象的引用被b的引用对象直接引用了,二者指向的是同一对象
而在之前对象的传递中可知
传递可变对象(列表,字典等)时,实际传递的是对象的引用(id),当进行赋值操作时,会直接对原对象数值进行操作
传递不可变对象(数字,元组)时,实际传递的也是对象的引用(id),当进行赋值操作时,会创建新对象进行操作而不改变原对象
由此可得
当改变b[0]时,因为b[0]为不可变对象,所以进行赋值操作时会创建新对象进行替代,所以b[0]的改变不会引起a[0]的改变
当改变b[1] [0]或者b[1] [1]时,因为b[1] [0]和b[1] [1]皆为可变对象,所以进行赋值操作时会直接改变原对象,所以b[1] [0]或者b[1] [1]的改变会引起a[1] [0]或者a[1] [1]的改变
深拷贝
a = [1, [2, 3]]
b = copy.deepcopy(a)
b不仅复制了a的引用,也复制了对象的内存地址
import copy
a = [1, [2, 3]]
b = copy.deepcopy(a)
print(a)
print(id(a), 'a')
print(id(a[0]), 'a[0]')
print(id(a[1]), 'a[1]')
print(id(a[1][0]), 'a[1][0]')
print(id(a[1][1]), 'a[1][1]')
print(b)
print(id(b), 'b')
print(id(b[0]), 'b[0]')
print(id(b[1]), 'b[1]')
print(id(b[1][0]), 'b[1][0]')
print(id(b[1][1]), 'b[1][1]')
print('=============')
b[1][0] = 0
print(a)
print(id(a), 'a')
print(id(a[0]), 'a[0]')
print(id(a[1]), 'a[1]')
print(id(a[1][0]), 'a[1][0]')
print(id(a[1][1]), 'a[1][1]')
print(b)
print(id(b), 'b')
print(id(b[0]), 'b[0]')
print(id(b[1]), 'b[1]')
print(id(b[1][0]), 'b[1][0]')
print(id(b[1][1]), 'b[1][1]')
输出
易得,除a与b外,a[1]与b[1]的对象id也不同
此时若改变二元列表中的值,原列表也不会发生改变
内存情况:
b既复制了a的引用,也复制了a引用对象的引用,并创建了新的对象进行存储
此时,无论改变b中的哪个对象,a都不会发生改变
相较于浅拷贝引用同一个对象,深拷贝中的每一个对象都已被复制,创建为新的独立对象,因此a不会再随b而改变