最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中對象的引用與復制代碼示例

 更新時間:2017年12月04日 09:23:33   作者:再見紫羅蘭  
這篇文章主要介紹了Python中對象的引用與復制代碼示例,具有一定借鑒價值,需要的朋友可以了解下。

可以說Python沒有賦值,只有引用。你這樣相當于創(chuàng)建了一個引用自身的結(jié)構(gòu),所以導致了無限循環(huán)。為了理解這個問題,有個基本概念需要搞清楚。

Python沒有「變量」,我們平時所說的變量其實只是「標簽」,是引用。

python中,"a=b"表示的是對象a引用對象b,對象a本身沒有單獨分配內(nèi)存空間(重要:不是復制!),它指向計算機中存儲對象b的內(nèi)存。因此,要想將一個對象復制為另一個對象,不能簡單地用等號操作,要使用其它的方法。如序列類的對象是(列表、元組)要使用切片操作符(即':')來做復制。

在python進行像b = a這樣的賦值時,只會創(chuàng)建一個對a的新引用,使a的引用計數(shù)加1,而不會創(chuàng)建新的對象:

>>> a = 'xyz'
>>> import sys
>>> sys.getrefcount(a)
3
>>> b = a
>>> sys.getrefcount(b)
4
>>> id(a)
88292288L
>>> id(b)
88292288L

這樣,當引用的對象是可變對象的時候(列表,字典,可變集合等),會產(chǎn)生意料之外的行為:

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

因為a和b引用的是同一對象,改變其中一個,另外一個也會隨之改變。當我們想建立一個副本而不是引用時,可以復制對象。

復制對象一般使用copy模塊:

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

這樣就可以了,但這種復制是一種淺復制,復制的新對象中包含的是對原始對象中的項的引用,如果對象的項為可變對象,也會產(chǎn)生不可控行為:

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

這時候就要使用深復制了。深復制將創(chuàng)建一個新對象,并遞歸地復制它所包含的所有對象:

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

對于不可改變的對象而言(字符串,數(shù)字,元組)等,沒有必要拷貝,因為它們是不可改變的,不用擔心會不經(jīng)意間改動了它們??截惒僮饕仓粫玫皆瓕ο螅?/p>

>>> a = (1, 2, 3)
>>> b = copy.copy(a)
>>> a is b
True

對于可變對象來(列表,字典,可變集合)來說,可以分別使用內(nèi)置函數(shù)list(),dict(),set()來進行淺復制,速度是比使用copy模塊快的。

列表也可以使用切片進行淺復制:

>>> a = [1, 2, 3, 4]
>>> b = a[:]
>>> a is b
False
>>> b
[1, 2, 3, 4]

對序列數(shù)據(jù)類型(字符串,列表,元組)進行*操作時,也僅僅是復制了對象中項的引用,如果使用*創(chuàng)建一個多維列表:

>>> a = [1, 2, 3]
>>> b = [a]
>>> c = b * 3
>>> a.append(4)
>>> c
[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]

最好是在列表推導中使用淺復制來創(chuàng)建多維列表,可以避免隱式的引用共享:

>>> a = [1, 2, 3]
>>> c = [list(a) for i in range(3)]
>>> a.append(4)
>>> c
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

總結(jié)

以上就是本文關(guān)于Python中對象的引用與復制代碼示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。

您可能感興趣的文章:

相關(guān)文章

最新評論

日喀则市| 海丰县| 南康市| 长沙市| 淳化县| 万荣县| 吉木乃县| 海林市| 辛集市| 徐汇区| 苍南县| 安远县| 札达县| 句容市| 石泉县| 沈丘县| 北海市| 磐安县| 西华县| 洛扎县| 扶余县| 新巴尔虎左旗| 西林县| 伊宁县| 馆陶县| 乾安县| 榆社县| 怀安县| 辽源市| 达尔| 武义县| 永济市| 定西市| 乐至县| 民县| 兴和县| 黔西县| 吴川市| 西吉县| 池州市| 重庆市|