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

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

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

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

Python沒(méi)有「變量」,我們平時(shí)所說(shuō)的變量其實(shí)只是「標(biāo)簽」,是引用。

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

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

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

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

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

因?yàn)閍和b引用的是同一對(duì)象,改變其中一個(gè),另外一個(gè)也會(huì)隨之改變。當(dāng)我們想建立一個(gè)副本而不是引用時(shí),可以復(fù)制對(duì)象。

復(fù)制對(duì)象一般使用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ù)制的新對(duì)象中包含的是對(duì)原始對(duì)象中的項(xiàng)的引用,如果對(duì)象的項(xiàng)為可變對(duì)象,也會(huì)產(chǎn)生不可控行為:

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

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

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

對(duì)于不可改變的對(duì)象而言(字符串,數(shù)字,元組)等,沒(méi)有必要拷貝,因?yàn)樗鼈兪遣豢筛淖兊?,不用?dān)心會(huì)不經(jīng)意間改動(dòng)了它們。拷貝操作也只會(huì)得到原對(duì)象:

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

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

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

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

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

>>> 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]]

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

相關(guān)文章

最新評(píng)論

满洲里市| 华坪县| 密山市| 基隆市| 浙江省| 象州县| 金寨县| 云和县| 新泰市| 马公市| 石柱| 西城区| 奉化市| 鄂伦春自治旗| 同仁县| 二连浩特市| 伊川县| 谢通门县| 安丘市| 金乡县| 胶州市| 平阳县| 无极县| 昌乐县| 女性| 健康| 兴安县| 城口县| 嫩江县| 林周县| 建水县| 潼南县| 桦南县| 西安市| 江阴市| 丘北县| 宝山区| 镇安县| 铜川市| 廊坊市| 普安县|