深浅拷贝
目录
深浅拷贝
赋值:多个变量名指向同一个内存地址一个变量对其进行操作,其他变量查看时都变动
lst = [1,2,3,[5,6,7]]
lst1 = lst
print(lst1)
print(lst)
lst[-1].append(8)
print(lst1)
print(lst)
浅拷贝:lst[1:10] -- 是浅拷贝浅拷贝只拷贝第一层元素修改第一层元素是,新开辟的不进行改变
lst = [1,2,3,[5,6,7]]
lst1 = lst.copy()
lst1[-1].append(8)
print(lst)
print(lst1)
lst = [1,2,3,[5,6,7]]
lst1 = lst.copy()
lst[3] = 567
print(lst1)
print(lst)
lst = [1,2,3,4,[5,6,7,[8,9]]]
lst1 = lst.copy() # [1,2,3,4,[5,6,7,[8,9]],10]
lst1.append(10)
print(lst)
print(lst1)
lst = [1,2,3,4,[5,6,7,[8,9]]]
lst1 = lst.copy()
lst1[-1][-1] = "56"
print(lst) # [1,2,3,4,[5,6,7,[8,9]]]
print(lst1) # ["56",2,3,4,[5,6,7,[8,9]]]
lst = [[1,2,],90,6,7,[5,6]]
lst1 = lst.copy()
lst1[-1] = 8
print(lst)
print(lst1)
dic = {"alex":[1,2,3,[5,6]]}
dic1 = dic.copy()
dic["alex"][0] = "56"
print(dic)
print(dic1)
深拷贝:不可变的数据类型共用,可变的数据类型重新开辟一个空间对源数据进行修改,深拷贝的内容不进行改变
import copy #导入
lst = [1,2,3,[5,6,7]]
lst1 = copy.deepcopy(lst) # 深拷贝
lst[-1].append(8)
print(lst)
print(lst1)
lst = [1,2,3,[5,6,7,[8,10,9]]]
import copy
lst1 = copy.deepcopy(lst)
print(id(lst[-1][-1]))
print(id(lst1[-1][-1]))
面试题:
li = [1,2]
li[1] = li
print(li)
结果:[1, [...]]
总结:
- 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 )。
- 浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。
- 深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。也就是说( 新瓶装新酒 )。