参考numpy array的深浅拷贝 & python list的深浅拷贝
python list的深浅拷贝
- list2=list1 是赋值操作,不是拷贝。两个是同一个对象的引用。故而同变化
- list2=list1.copy()是浅拷贝,相当于list2引用一个新对象,然后把list1中的值拷贝到这个新对象中。但是如果list1=[1,[1,2],3]包含嵌套,嵌套第一层拷贝过去的是值,第二层保存的实际是地址,所以拷贝过去的也是地址,这样修改list2[1][0]=3的话,实际上list1的相应的值也会发生改变。
- 使用列表推导式list2=[i for i in list1]同list1.copy(),相当于第一层是深拷贝,内层由于保存的是地址,属于浅拷贝。
- 使用for循环,逐个将list1中元素append到list2中,同列表推导式
- 使用切片list2=list1[1:]虽然也是生成新的list,但是同样对内层是浅拷贝。
- list2=copy.deepcopy(list1)真正深拷贝
import copy
list1 = [1,2,[3,4]]
list2 = list1
print("list1:", list1)
print("list2:", list2)
print("id of list1: ", id(list1))
print("id of list2: ", id(list2))
list3 = list1.copy()
print("list3:", list3)
print("id of list3: ", id(list3))
list3[0] = 11
list3[2][0] = 88
print("list3:", list3)
print("list1:", list1)
list4 = [i for i in list1]
print("id of list4: ", id(list4))
print("list1:", list1)
print("list4:", list4)
list4[1] = 22
list4[2][0] = 99
print("list4:", list4)
print("list1:", list1)
list5 = []
for i in list1:
list5.append(i)
print("id of list5: ", id(list5))
print("list5:", list5)
list5[1] = 55
list5[2][0] = 77
print("list5:", list5)
print("list1:", list1)
list6 = list1[1:]
print("id of list6: ", id(list6))
print("list6:", list6)
list6[0] = 6
list6[1][0] = 66
print("list6:", list6)
print("list1:", list1)
list7 = copy.deepcopy(list1)
print("id of list7: ", id(list7))
print("list7:", list7)
list7[0] = 7
list7[2][0] = 777
print("list7:", list7)
print("list1:", list1)
numpy array的深浅拷贝
-
数组切片是原始数组的视图,这意味着数据不会被复制,视图上的任何修改都会被直接反映到源数组上. -
array1,array2,array3,array4实际指向同一个内存值,任意修改其中的一个变量,其他变量值都会被修改。 -
若想要得到的是ndarray切片的一份副本而非视图,就需要显式的进行复制操作函数copy() array5=array1.copy() #对原始的array1的复制 array6=array1[1:4].copy() #对切片array1[1:4]的复制 那么,修改array5或array6,就不会影响array1。
Numpy 的 View 和 Copy可参考Numpy 的 View 和 Copy
|