要談列表的複製,我們就要談到Python的賦值規則 首先我們創建列表a: 通常我們複製一個元素的方法是這樣的: 通過這行代碼,我們固然是創建了一個與列表a相等的列表b,但此時卻會出現一個問題: 當我們嘗試對新創建的列表b進行排序操作(如倒序操作)時: 到這裡一切看似沒啥毛病,實則坑爹的事情已經悄然發 ...
要談列表的複製,我們就要談到Python的賦值規則
首先我們創建列表a:
a=[1,2,3]
通常我們複製一個元素的方法是這樣的:
b=a #複製元素的一般方法 print(a) print(b) 結果為: [1,2,3] [1,2,3]
通過這行代碼,我們固然是創建了一個與列表a相等的列表b,但此時卻會出現一個問題:
當我們嘗試對新創建的列表b進行排序操作(如倒序操作)時:
b.reverse() print(b) 結果為: [3,2,1]
到這裡一切看似沒啥毛病,實則坑爹的事情已經悄然發生~
讓我們嘗試列印一下列表a的值:
print(a) 結果為: [3,2,1]
可以看到,列表a的排序也改變了
這未必是我們希望看到的結果
出現這種情況的原因是:
當我們使用“b=a”這條代碼來賦值列表b時,列表b與列表a是指向同一個地址的,而對列表進行排序操作並不會賦給列表一個新的地址,也就是說此時無論我們是對列表a或是對列表b進行排序操作,另一個列表的排序也會隨之改變
而如果我們對列表a或是對列表b進行賦值操作的話,則沒有這種顧慮,因為在賦值的時候列表會分配到一個新的地址
那麼我們要如何解決這一問題呢?
很簡單,只需利用列表的分片,使用如下代碼對列表進行複製操作:
a=[1,2,3] b=a[:] #複製列表的正確方式 print(a) print(b) 結果為: [1,2,3] [1,2,3]
此時我們再對列表b進行倒序操作:
b.reverse() print(a) print(b) 結果為: [1,2,3] [3,2,1]
可以看到只有列表b的排序改變了,而列表a的排序沒有變,那是因為列表a和列表b已經沒有那種剪不斷理還亂的羈絆了 (乛◡乛)