亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

在python進(jìn)行像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

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

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

因為a和b引用的是同一對象,改變其中一個,另外一個也會隨之改變。當(dāng)我們想建立一個副本而不是引用時,可以復(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ù)字,元組)等,沒有必要拷貝,因為它們是不可改變的,不用擔(dān)心會不經(jīng)意間改動了它們??截惒僮饕仓粫玫皆瓕ο螅?/p>

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

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

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

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

對序列數(shù)據(jù)類型(字符串,列表,元組)進(jìn)行*操作時,也僅僅是復(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]]

最好是在列表推導(dǎo)中使用淺復(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把列表中的字符串轉(zhuǎn)成整型的3種方法詳解

    python把列表中的字符串轉(zhuǎn)成整型的3種方法詳解

    這篇文章主要介紹了python把列表中的字符串轉(zhuǎn)成整型的3種方法詳解,python中在不同類型數(shù)據(jù)轉(zhuǎn)換方面是有標(biāo)準(zhǔn)庫的,使用非常方便,但是在開發(fā)中,經(jīng)常在list中字符轉(zhuǎn)成整形的數(shù)據(jù)方便遇到問題,需要的朋友可以參考下
    2023-07-07
  • Python 內(nèi)置函數(shù)complex詳解

    Python 內(nèi)置函數(shù)complex詳解

    這篇文章主要介紹了Python 內(nèi)置函數(shù)complex詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • python寫入已存在的excel數(shù)據(jù)實例

    python寫入已存在的excel數(shù)據(jù)實例

    下面小編就為大家分享一篇python寫入已存在的excel數(shù)據(jù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python中的面向?qū)ο缶幊淘斀?上)

    Python中的面向?qū)ο缶幊淘斀?上)

    這篇文章主要介紹了Python中的面向?qū)ο缶幊淘斀?上),本文講解了創(chuàng)建類、實例化類、類屬性、特殊方法內(nèi)建屬性、靜態(tài)變量屬性、實例變量屬性、方法屬性、靜態(tài)方法、類方法等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • 16個python常用魔法函數(shù)小結(jié)

    16個python常用魔法函數(shù)小結(jié)

    本文主要介紹了16個python常用魔法函數(shù)小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 使用Python批量處理Excel文件并轉(zhuǎn)為csv文件示例

    使用Python批量處理Excel文件并轉(zhuǎn)為csv文件示例

    這篇文章主要介紹了使用Python批量處理Excel文件并轉(zhuǎn)為csv文件示例,文中通過代碼示例給大家介紹非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • python字符串常規(guī)操作大全

    python字符串常規(guī)操作大全

    這篇文章主要給大家介紹了關(guān)于python字符串常規(guī)操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 基于Python?OpenCV和?dlib實現(xiàn)眨眼檢測

    基于Python?OpenCV和?dlib實現(xiàn)眨眼檢測

    這篇文章主要介紹了基于Python?OPenCV及dlib實現(xiàn)檢測視頻流中的眨眼次數(shù)。文中的代碼對我們的學(xué)習(xí)和工作有一定價值,感興趣的同學(xué)可以參考一下
    2021-12-12
  • Python垃圾郵件的邏輯回歸分類示例詳解

    Python垃圾郵件的邏輯回歸分類示例詳解

    這篇文章主要給大家介紹了關(guān)于Python垃圾郵件的邏輯回歸分類的相關(guān)資料,作為初學(xué)者實踐文本分類是一個不錯的開始,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • 基于Python實現(xiàn)語音識別和語音轉(zhuǎn)文字

    基于Python實現(xiàn)語音識別和語音轉(zhuǎn)文字

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實現(xiàn)語音識別和語音轉(zhuǎn)文字功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-09-09

最新評論