Python中使用copy模塊實(shí)現(xiàn)列表(list)拷貝
引用是指保存的值為對(duì)象的地址。在 Python 語(yǔ)言中,一個(gè)變量保存的值除了基本類型保存的是值外,其它都是引用,因此對(duì)于它們的使用就需要小心一些。下面舉個(gè)例子:
問(wèn)題描述:已知一個(gè)列表,求生成一個(gè)新的列表,列表元素是原列表的復(fù)制
a=[1,2]
b=a
這種做法其實(shí)并未真正生成一個(gè)新的列表,b指向的仍然是a所指向的對(duì)象。這樣,如果對(duì)a或b的元素進(jìn)行修改,a,b的值同時(shí)發(fā)生變化。
解決的方法為:
a=[1,2]
b=a[:]
這樣修改a對(duì)b沒(méi)有影響。修改b對(duì)a沒(méi)有影響。
但 這種方法只適用于簡(jiǎn)單列表,也就是列表中的元素都是基本類型,如果列表元素還存在列表的話,這種方法就不適用了。原因就是,象a[:]這種處理,只是將列 表元素的值生成一個(gè)新的列表,如果列表元素也是一個(gè)列表,如:a=[1,[2]],那么這種復(fù)制對(duì)于元素[2]的處理只是復(fù)制[2]的引用,而并未生成 [2]的一個(gè)新的列表復(fù)制。為了證明這一點(diǎn),測(cè)試步驟如下:
>>> a=[1,[2]]
>>> b=a[:]
>>> b
[1, [2]]
>>> a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2, 3]]
可見(jiàn),對(duì)a的修改影響到了b。如果解決這一問(wèn)題,可以使用copy模塊中的deepcopy函數(shù)。修改測(cè)試如下:
>>> import copy
>>> a=[1,[2]]
>>> b=copy.deepcopy(a)
>>> b
[1, [2]]
>>> a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2]]
有時(shí)候知道這一點(diǎn)是非常重要的,因?yàn)榭赡苣愕拇_需要一個(gè)新的列表,并且對(duì)這個(gè)新的列表進(jìn)行操作,同時(shí)不想影響原來(lái)的列表。
相關(guān)文章
Python字符串格式化str.format()方法的實(shí)現(xiàn)
字符串的格式化是一個(gè)非常重要的功能,用于創(chuàng)建包含變量值的字符串,本來(lái)就來(lái)介紹一下Python字符串格式化str.format()方法的實(shí)現(xiàn),感興趣的可以了解一下2023-11-11
Python創(chuàng)建相同值數(shù)組/列表的兩種方法
Pytorch 統(tǒng)計(jì)模型參數(shù)量的操作 param.numel()
Flask應(yīng)用部署與多端口管理實(shí)踐全指南
python爬蟲基礎(chǔ)知識(shí)點(diǎn)整理
簡(jiǎn)單快捷:NumPy入門教程的環(huán)境設(shè)置
python Boltons庫(kù)實(shí)用功能探索(深度復(fù)制類型檢查重試機(jī)制)

