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)文章
Python內(nèi)置函數(shù)zip map filter的使用詳解
這篇文章主要介紹了Python內(nèi)置函數(shù)zip map filter的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
Python中str.format()和f-string的使用
本文主要介紹了Python中str.format()和f-string的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02
TensorFlow搭建神經(jīng)網(wǎng)絡最佳實踐
這篇文章主要為大家詳細介紹了TensorFlow搭建神經(jīng)網(wǎng)絡最佳實踐,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03
使用Python下載歌詞并嵌入歌曲文件中的實現(xiàn)代碼
這篇文章主要介紹了使用Python下載歌詞并嵌入歌曲文件中的實現(xiàn)代碼,需要借助eyed3模塊,需要的朋友可以參考下2015-11-11
Python統(tǒng)計python文件中代碼,注釋及空白對應的行數(shù)示例【測試可用】
這篇文章主要介紹了Python統(tǒng)計python文件中代碼,注釋及空白對應的行數(shù),涉及Python針對py文件的讀取、遍歷、判斷、統(tǒng)計等相關(guān)操作技巧,需要的朋友可以參考下2018-07-07

