对于python中列表的拷贝:
1.浅拷贝: 将原对象或原列表的引用直接赋给新对象、新列表,新对象、列表只是原对象的一个引用。
2.深拷贝: 创建一个新的对象或列表,将原对象的各项属性的“值”(列表的所有元素)拷贝过来,是“值”而不是“引用”。
对于浅拷贝的结果如下:
arr = [1, 4, 5 ,2 ,4, 1]
#copy函数拷贝
arr1 = arr.copy()
print(arr1)
## [1, 4, 5 ,2 ,4, 1]
#列表切片拷贝
arr2 = arr[:]
print(arr2)
## [1, 4, 5 ,2 ,4, 1]
此时并未看出拷贝的问题所在
(首先 不可用arr1 = arr进行简单复制,该操作仅仅是简单的让arr1和arr指向了同一个列表,而非拷贝arr的元素)
arr = [1, 4, 5 ,2 ,4, 1]
#copy函数拷贝(用切片结果也是如此)
arr1 = arr.copy()
arr[1] = 0
print(arr1)
## [1, 4, 5 ,2 ,4, 1]
然而
arr = [1, 4, 5 ,2 ,4, 1]
arr2 = arr
arr[1] = 0
print(arr2)
## [1, 0, 5, 2, 4, 1]
以上足以证明arr1 = arr并非直接拷贝,但是用copy()和切片就是对其进行了元素的拷贝吗?不妨将该列表拓展到二维。
arr = [[1,2,3], [4,5,6], [7,8,9]]
#列表copy拷贝
arr2 = arr.copy()
arr[1][1] = 0
print(arr2)
## [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
发现也并非直接拷贝,浅拷贝只是拷贝了外层的对象,若包含嵌套对象的话,拷贝的也只是其引用。而深拷贝就可以解决如下问题。
import copy
arr = [[1,2,3], [4,5,6], [7,8,9]]
#使用deepcopy函数进行深拷贝
arr1 = copy.deepcopy(arr)
arr[1][1] = 0
print(arr1)
## [[1, 2, 3], [4, 5, 6], [7, 8, 9]]