python列表中的深淺copy

2022-09-16 09:42:16 字數 2787 閱讀 1177

列表中的賦值和平常的賦值是不一樣的,看下面的**:

in [1]: a = 1in [2]: b =a

in [3]: a

out[3]: 1in [4]: b

out[4]: 1in [5]: id(a)

out[5]: 4452948992in [6]: id(b)

out[6]: 4452948992in [7]: id(1)

out[7]: 4452948992in [8]: a = 4in [9]: b

out[9]: 1in [10]: id(a)

out[10]: 4452949088in [11]: id(b)

out[11]: 4452948992in [12]: id(1)

out[12]: 4452948992

在這段**中,a = 1,a指向記憶體位址;b = a,b也指向記憶體位址1,所以當a指向記憶體位址4的時候,b的值不變,因為b指向的記憶體位址是1而不是a。

在列表中就不一樣了,下面介紹列表的深淺copy

1.直接賦值

in [1]: li = [1,2,3]

in [2]: n =li

in [3]: li

out[3]: [1, 2, 3]

in [4]: n

out[4]: [1, 2, 3]

in [5]: li[0] = 'a'

in [6]: li

out[6]: ['

a', 2, 3]

in [7]: n

out[7]: ['

a', 2, 3]

in [8]: id(li)

out[8]: 4342626376in [9]: id(n)

out[9]: 4342626376in [10]: id([1,2,3])

out[10]: 4440762824

可以看出,在列表中,n是指向了li的記憶體位址, 不是列表[1,2,3]了,所以li的值變化的話,n也跟著變化。可以想象成li和n都指向了乙個水杯,水杯裡有三塊白糖,把其中一塊換成了黑糖,

那不管是用li還是n,水杯裡現在都是有兩塊白糖和一塊黑糖。

2.淺copy

in [1]: li2 = [1,2,3,['

alex

',27]]

in [2]: n2 =li2.copy()

in [3]: li2

out[3]: [1, 2, 3, ['

alex

', 27]]

in [4]: n2

out[4]: [1, 2, 3, ['

alex

', 27]]

in [5]: id(li2),id(n2)

out[6]: (4536317192, 4536271560)

in [6]: li2[0] = 'a'

in [7]: li2

out[7]: ['

a', 2, 3, ['

alex

', 27]]

in [8]: n2

out[8]: [1, 2, 3, ['

alex

', 27]]

in [9]: id(li2[0]),id(n2[0])

out[9]: (4509371784, 4506651648)

兩個列表的記憶體位址(id)是不一樣的,說明n2重新開闢了一片記憶體,所以當li2裡面的元素改變後,n2裡的元素並沒有改變。

下面就不一樣了

in [10]: li2[3][0] = '帥哥'

in [11]: li2

out[11]: ['

a', 2, 3, ['

帥哥', 27]]

in [12]: n2

out[12]: [1, 2, 3, ['

帥哥', 27]]

in [13]: id(li2[3]),id(n2[3])

out[13]: (4536316872, 4536316872)

in [15]: id(li2[3][0])

out[15]: 4536362680 #

和li2[3]的記憶體位址不一樣

li2[3]和n2[3]的記憶體位址是一樣的,還是共享乙個記憶體位址,所以乙個跟著改變,另乙個也會跟著變,要想解決這個問題就要用到深copy了

4.深copy(不太常用)

in [1]: import

copy

in [2]: li3 = [1,2,3,['

alex

',27]]

in [3]: n3 =copy.deepcopy(li3)

in [4]: li3

out[4]: [1, 2, 3, ['

alex

', 27]]

in [5]: n3

out[5]: [1, 2, 3, ['

alex

', 27]]

in [6]: li3[3][0] = '帥哥'

in [7]: li3

out[7]: [1, 2, 3, ['

帥哥', 27]]

in [8]: n3

out[8]: [1, 2, 3, ['

alex

', 27]]

可以看出,等於是完全copy了乙份,除非特殊場景這個方法不常用,也不建議用,因為如果列表存的資料量特別大的話,這樣深copy乙份直接翻一倍,浪費空間。

Python中列表的深淺拷貝

copy lst py物件三要素 比較運算子 is 身份運算子 小資料池 列表的淺拷貝 列表的深拷貝 py物件三要素 idtype value 比較運算子 通過value進行判斷 a 257 b 257 a b true is 身份運算子 通過id進行判斷 a 257 b 257 id a id b...

python 列表和字典的引用與複製 copy

列表或字典的引用 引用針對變數的時候,傳遞引用後,對引用後的物件的值進行改變是不會影響到原值的 而列表不一樣如 spam 42 cheese spam spam 100 print spam out 100 print cheese out 42 如果對列表進行引用會是什麼情況呢,我們來看看 spa...

python深淺複製 Python中的深淺拷貝

1.什麼是深淺拷貝?python中一切皆物件,python中的數字 字串 元組等,如果存放在了記憶體中,這部分記憶體裡面的內容是不會改變的,但是也有情況,記憶體中存放了可變物件,比如說列表和字典,他們的記憶體空間是可以被修改的。下面我們定義乙個列表 list 1,2,3,4,5 list1 list...