Python深淺拷貝

2022-05-07 05:03:08 字數 1801 閱讀 1678

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用

針對該列表l1=['a','b','c',['d','e','f']]一般有三種方法,分別為:拷貝(賦值)、淺拷貝、深拷貝

注意:拷貝/淺拷貝/深拷貝都是針對可變型別資料而言的

id不變值可變,即在原值的基礎上修改,則為可變資料型別;值變id也變,即重新申請乙個空間放入新值,則為不可變資料型別。

age = 19

print(f'first:')

age = 20

print(f'second:')

first:4384901776

second:4384901808

如果l2是l1的拷貝物件,則l1內部的任何資料型別的元素變化,則l2內部的元素也會跟著改變,因為可變型別值變id不變。

l1 = ['a', 'b', 'c', ['d', 'e', 'f']]

l2 = l1

print(l1)

['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2)
['a', 'b', 'c', ['d', 'e', 'f'], 'g']
如果l2是l1的淺拷貝物件,則l1內的不可變元素發生了改變,l2不變;如果l1內的可變元素發生了改變,則l2會跟著改變。

import copy

l1 = ['a', 'b', 'c', ['d', 'e', 'f']]

l2 = copy.copy(l1)

print(l1)

['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2)
['a', 'b', 'c', ['d', 'e', 'f']]
print(l1)

['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
print(l2)
['a', 'b', 'c', ['d', 'e', 'f', 'g']]
如果l2是l1的深拷貝物件,則l1內的不可變元素發生了改變,l2不變;如果l1內的可變元素發生了改變,l2也不會變,即l2永遠不會因為l1的變化而變化。

import copy

l1 = ['a', 'b', 'c', ['d', 'e', 'f']]

l2 = copy.deepcopy(l1)

print(l1)

['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2)
['a', 'b', 'c', ['d', 'e', 'f']]
print(l1)

['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
print(l2)
['a', 'b', 'c', ['d', 'e', 'f']]

python 深淺拷貝案例 python 深淺拷貝

深淺拷貝 對於 數字 和 字串 而言,賦值 淺拷貝和深拷貝無意義,因為其永遠指向同乙個記憶體位址 import copy a1 22255 a2 22255 print id a1 id a2 3428240 3428240 對於字典 元祖 列表 而言,進行賦值 淺拷貝和深拷貝時,其記憶體位址的變化...

python 深淺拷貝

建立乙個寬度為3,高度為4的陣列 mylist 0 3 4 0,0,0 0,0,0 0,0,0 0,0,0 但是當操作mylist 0 1 1時,發現整個第二列都被賦值,變成 0,1,0 0,1,0 0,1,0 0,1,0 list n n shallow copies of list concat...

python深淺拷貝

python 深淺拷貝 shallow copy 和 deep copy 對於乙個列表,列表裡面可以再放入乙個列表 1 若想複製這乙個列表,使用列表的普通的copy 方法,只能拷貝出列表裡表層的元素,而列表裡的列表卻無法拷貝,只能指向前乙個列表.修改拷貝出的列表裡列表裡的元素,原來的列表會發生改變....