列表的複製

引用是指保存的值爲對象的地址。在 Python 語言中,一個變量保存的值除了基本類型保存的是值外,其它都是引用,所以對於它們的使用就須要當心一些。下面舉個例子:app

問題描述:已知一個列表,求生成一個新的列表,列表元素是原列表的複製
ide

複製代碼代碼以下:函數


a=[1,2]
b=a
測試


這種作法其實並未真正生成一個新的列表,b指向的仍然是a所指向的對象。這樣,若是對a或b的元素進行修改,a,b的值同時發生變化。spa


解決的方法爲:
orm

複製代碼代碼以下:對象


a=[1,2]
b=a[:]
it


這樣修改a對b沒有影響。修改b對a沒有影響。io


但 這種方法只適用於簡單列表,也就是列表中的元素都是基本類型,若是列表元素還存在列表的話,這種方法就不適用了。緣由就是,象a[:]這種處理,只是將列 表元素的值生成一個新的列表,若是列表元素也是一個列表,如:a=[1,[2]],那麼這種複製對於元素[2]的處理只是複製[2]的引用,而並未生成 [2]的一個新的列表複製。爲了證實這一點,測試步驟以下:
class

複製代碼代碼以下:


>>> a=[1,[2]]
>>> b=a[:]
>>> b
[1, [2]]
>>> a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2, 3]]


可見,對a的修改影響到了b。若是解決這一問題,能夠使用copy模塊中的deepcopy函數。修改測試以下:

複製代碼代碼以下:


>>> import copy
>>> a=[1,[2]]
>>> b=copy.deepcopy(a)
>>> b
[1, [2]]
>>> a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2]]


有時候知道這一點是很是重要的,由於可能你的確須要一個新的列表,而且對這個新的列表進行操做,同時不想影響原來的列表。

相關文章
相關標籤/搜索