列表中的賦值和平常的賦值是不一樣的,看下面的**:
in [1]: a = 1in [2]: b =ain [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]: importcopy
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...