list 的两种拷贝方式
1.深度拷贝(deep copy)
需要引入 deepcopy 函数,形成了两个完全互不影响的列表,就算改变列表中可变对象(如列表、字典等)也不会使原列表改变。
list_old = [[1,10],2,3,4,5]
list_new = deepcopy(list_old)
list_new[0][1] = 2220
print("deep copy")
print(list_old)# [[1,10],2,3,4,5]
print(list_new)# [[1,2220],2,3,4,5]
2. 浅拷贝(shallow copy)
有多种实现方式:
1 使用列表切片 [:]
2 引入 copy 函数
3 使用 list 构造函数
# 因为在原本列表中有可变变量(嵌套了一个列表)所以改变了新的列表同时
# 也会更改了以前的列表,因为两者共用了同一地址引用
list_old = [[1,10],2,3,4,5]
list_new1 = list_old[:]
list_new2 = copy(list_old)
list_new3 = list(list_old)
list_new1[0][1] = 2220
list_new2[0][1] = 2220
list_new3[0][1] = 2220
print("shallow copy")
print(list_old)# [[1,2220],2,3,4,5]
print(list_new1)# [[1,2220],2,3,4,5]
print(list_new2)# [[1,2220],2,3,4,5]
print(list_new3)# [[1,2220],2,3,4,5]
此时改变了新的拷贝的列表原列表也会被改变,因为浅拷贝新旧两个列表指向了同一个引用地址。
3. 浅拷贝的使用场景
根据浅拷贝的特性,由于其不另外开新的地址说明不使用新的内存所以拷贝速度比深度拷贝快。当所拷贝的对象中不嵌套可变变量时候应考虑使用浅拷贝。