国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中對象的引用與復(fù)制代碼示例

2020-01-04 16:12:26
字體:
供稿:網(wǎng)友

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

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

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

在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引用的是同一對象,改變其中一個,另外一個也會隨之改變。當我們想建立一個副本而不是引用時,可以復(fù)制對象。

復(fù)制對象一般使用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]

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

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

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

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

對于不可改變的對象而言(字符串,數(shù)字,元組)等,沒有必要拷貝,因為它們是不可改變的,不用擔心會不經(jīng)意間改動了它們。拷貝操作也只會得到原對象:

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

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

列表也可以使用切片進行淺復(fù)制:

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

對序列數(shù)據(jù)類型(字符串,列表,元組)進行*操作時,也僅僅是復(fù)制了對象中項的引用,如果使用*創(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]]

最好是在列表推導中使用淺復(fù)制來創(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中對象的引用與復(fù)制代碼示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。


注:相關(guān)教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 昭觉县| 安康市| 姜堰市| 托克逊县| 岑巩县| 晋中市| 三门峡市| 建湖县| 方正县| 宣汉县| 瓮安县| 铁力市| 河西区| 霍山县| 靖宇县| 台江县| 苏尼特左旗| 宜都市| 松潘县| 育儿| 南投县| 达孜县| 天气| 绍兴县| 九寨沟县| 郴州市| 利川市| 姜堰市| 淮安市| 建始县| 太康县| 南丹县| 黄陵县| 张家港市| 旌德县| 历史| 海阳市| 盱眙县| 扎囊县| 谢通门县| 五寨县|