学习深浅拷贝要先明白赋值
赋值:只是复制了新对象的引用,不会开辟新的空间
li=[1,23,3,45,3]
li2=li #赋值:复制对象会随着原列表一起变化
print(li) #[1, 23, 3, 45, 3]
print(li2) #[1, 23, 3, 45, 3]
li.append(90)
print(li) #[1, 23, 3, 45, 3,90]
print(li2) #[1, 23, 3, 45, 3,90]
# id():检测数的内存地址
print(id(li)) #2655728521736
print(id(li2)) #2655728521736
浅拷贝
# 浅拷贝:数据半共享,会创建新的对象,拷贝第一层的数据,嵌套层还会指向原来的地址
# 嵌套层还会指向原来的地址
import copy
a=[1,2,4,3,[4,5]] #嵌套列表:一个列表里面还有列表
b=copy.copy(a) #浅拷贝
print(f'这是原列表:{a}')
print(f'这是原列表:{b}')
a.append(8)
print(f'这是现在列表:{a}') #[1, 2, 4, 3, [4, 5], 8]
print(f'这是现在列表:{b}') #[1, 2, 4, 3, [4, 5]]
print(id(a)) #2418006053128
print(id(b)) #2418006053192
a[4].append(2) #拿到嵌套层,为嵌套层添加
print(a) #[1, 2, 4, 3, [4, 5, 2], 8]
print(f'这是现在列表:{a}') #[1, 2, 4, 3, [4, 5, 2], 8]
print(f'这是现在列表:{b}') #[1, 2, 4, 3, [4, 5, 2]] 数据半共享,里面的嵌套层数据公用,外层不共享
print(id(a[4])) #2494921697544 #检测嵌套层内存地址 两个地址一样,说明用的一个
print(id(b[4])) #2494921697544
深拷贝:数据完全不共享,不节省空间,安全性更高
import copy #导入模块、
a=[1,2,3,[4,5]]
b=copy.deepcopy(a) #深拷贝:是两个完全独立的对象,互不干扰
print('原来的:',a) #[1, 2, 3, [4, 5]]
print('原来的:',b) #[1, 2, 3, [4, 5]]
a.append(9)
a[3].append(99)
print(a) #[1, 2, 3, [4, 5, 99], 9]
print(b) #[1, 2, 3, [4, 5]]