欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中的引用和拷貝淺析

 更新時(shí)間:2014年11月22日 16:10:22   投稿:junjie  
這篇文章主要介紹了Python中的引用和拷貝淺析,本文同時(shí)講解了深拷貝和淺拷貝、引用計(jì)數(shù)和垃圾回收等內(nèi)容,需要的朋友可以參考下

If an object's value can be modified, the object is said to be mutable. If the value cannot be modified,the object is said to be immutable.

mutable 可變類(lèi)型,例如 list,set,自定義類(lèi)型(等價(jià)于C#中的引用類(lèi)型);

immutable 不可變類(lèi)型,例如string,numbers等(等價(jià)于C#中的值類(lèi)型);

一、引用和拷貝(references and copies)

當(dāng)程序中使用=賦值操作符時(shí),例如a=b,

對(duì)于不可變的對(duì)象,a作為b的一個(gè)拷貝被創(chuàng)建,a和b將指向不同的內(nèi)存地址,a和b相互獨(dú)立。

復(fù)制代碼 代碼如下:

def TestCopy():
    a = 10
    b = a
    a =20
    print (b) #b still is 10

但是對(duì)于可變的對(duì)象,a作為b的一個(gè)引用被創(chuàng)建,a和b的元素公用相同的內(nèi)存地址,a和b的元素共享。
復(fù)制代碼 代碼如下:

def TestRef():
    a=[1,2,3,4]
    b=a   #b is a reference to a
    print (b is a) # True
    b[2] = -100 #change an element in b
    print (a) # a also changed to [1,2,-100,4]

二、深拷貝和淺拷貝(shallow copy and deep copy)

為了避免可變對(duì)象指向同一個(gè)對(duì)象,必須創(chuàng)建一個(gè)新的拷貝,而不是引用。
在python中可以對(duì)容器對(duì)象(例如lists和dictionaries)使用兩種拷貝:淺拷貝和深拷貝。
 
淺拷貝創(chuàng)建一個(gè)新的對(duì)象,但是使用原來(lái)對(duì)象的元素的引用(如果是不變類(lèi)型,相當(dāng)于是拷貝)來(lái)填充新對(duì)象。可以使用copy.copy()來(lái)實(shí)現(xiàn)淺拷貝。

復(fù)制代碼 代碼如下:

def TestShallowCopy():
    a = [ 1, 2, [3,4] ]
    b = list(a) # create a shallow copy of a
    print (b is a) #False
    b.append(100) #append element to b
    print (b)
    print (a) # a is unchanged
    b[2][0] = -100 # modify an element inside b
    print (b)
    print (a)  # a is changed

在這個(gè)例子中,a和b共享相同的可變?cè)亍K孕薷钠渲幸粋€(gè)list對(duì)象中的元素,另一個(gè)list對(duì)象也會(huì)被修改。

深拷貝創(chuàng)建一個(gè)新的對(duì)象,同時(shí)遞歸地拷貝對(duì)象所包含的所有的元素??梢允褂胏opy.deepcopy()來(lái)實(shí)現(xiàn)深拷貝。

復(fù)制代碼 代碼如下:

def TestDeepCopy():
  import copy
  a = [1, 2, [3, 4]]
  b = copy.deepcopy(a)
  b[2][0] = -100
  print (b)  # b is changed
  print (a)  # a is unchanged

在這個(gè)例子中,a和b是對(duì)立的list對(duì)象,且他們的元素也相互獨(dú)立。

三、引用計(jì)數(shù)和垃圾回收

python中的所有的對(duì)象都是引用計(jì)數(shù)的,一個(gè)對(duì)象賦值或加入容器時(shí),它的引用計(jì)數(shù)就會(huì)自增,當(dāng)使用del時(shí)或變量賦值為其他值時(shí),引用計(jì)數(shù)就會(huì)自減,當(dāng)引用計(jì)數(shù)為0時(shí),python的垃圾回收器就會(huì)回收該變量。

復(fù)制代碼 代碼如下:

def TestGarbageCollection():
  import sys
  print(sys.getrefcount(37))
  a = 37 # Creates an object with value 37
  print(sys.getrefcount(37))
  b = a # Increases reference count on 37
  print(sys.getrefcount(37))
  c = []
  c.append(b) # Increases reference count on 37
  print(sys.getrefcount(37))
  del a # Decrease reference count of 37
  print(sys.getrefcount(37))
  b = 42 # Decrease reference count of 37
  print(sys.getrefcount(37))
  c[0] = 2.0 # Decrease reference count of 37
  print(sys.getrefcount(37))
 
TestGarbageCollection()

運(yùn)行結(jié)果為:

復(fù)制代碼 代碼如下:

11
12
13
14
13
12
11

為啥一上來(lái)就有11個(gè)引用了呢?誰(shuí)知道?

相關(guān)文章

  • 使用Python將xmind腦圖轉(zhuǎn)成excel用例的實(shí)現(xiàn)代碼(一)

    使用Python將xmind腦圖轉(zhuǎn)成excel用例的實(shí)現(xiàn)代碼(一)

    這篇文章主要介紹了使用Python將xmind腦圖轉(zhuǎn)成excel用例的實(shí)現(xiàn)代碼(一),本文給大家介紹的非常詳細(xì)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Python實(shí)現(xiàn)手勢(shì)識(shí)別

    Python實(shí)現(xiàn)手勢(shì)識(shí)別

    這篇文章主要介紹了Python如何實(shí)現(xiàn)手指指尖的檢測(cè),并且可以在windows系統(tǒng)下通過(guò)判斷手指數(shù)目,來(lái)模擬鍵盤(pán)操作,感興趣的朋友可以了解下
    2020-10-10
  • Python?NumPy教程之?dāng)?shù)組的創(chuàng)建詳解

    Python?NumPy教程之?dāng)?shù)組的創(chuàng)建詳解

    這篇文章主要為大家詳細(xì)介紹了Python?NumPy中數(shù)組的創(chuàng)建方式,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下
    2022-08-08
  • PyTorch的Optimizer訓(xùn)練工具的實(shí)現(xiàn)

    PyTorch的Optimizer訓(xùn)練工具的實(shí)現(xiàn)

    這篇文章主要介紹了PyTorch的Optimizer訓(xùn)練工具的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 利用numba讓python速度提升百倍

    利用numba讓python速度提升百倍

    這篇文章主要介紹了利用numba讓python速度提升百倍,python由于它動(dòng)態(tài)解釋性語(yǔ)言的特性,numba是一款可以將python函數(shù)編譯為機(jī)器代碼的JIT編譯器,下面針對(duì)numba相關(guān)內(nèi)容展開(kāi),需要的小伙伴可以參考一下
    2022-03-03
  • python靜態(tài)方法實(shí)例

    python靜態(tài)方法實(shí)例

    這篇文章主要介紹了python靜態(tài)方法,實(shí)例分析了python靜態(tài)方法的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • 詳解用Python進(jìn)行時(shí)間序列預(yù)測(cè)的7種方法

    詳解用Python進(jìn)行時(shí)間序列預(yù)測(cè)的7種方法

    這篇文章主要介紹了詳解用Python進(jìn)行時(shí)間序列預(yù)測(cè)的7種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Python字典對(duì)象實(shí)現(xiàn)原理詳解

    Python字典對(duì)象實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了Python字典對(duì)象實(shí)現(xiàn)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Matplotlib實(shí)戰(zhàn)之折線圖繪制詳解

    Matplotlib實(shí)戰(zhàn)之折線圖繪制詳解

    折線圖是一種用于可視化數(shù)據(jù)變化趨勢(shì)的圖表,它可以用于表示任何數(shù)值隨著時(shí)間或類(lèi)別的變化,本文主要介紹了如何利用Matplotlib實(shí)現(xiàn)折線圖的繪制,感興趣的可以了解下
    2023-08-08
  • python調(diào)用百度REST API實(shí)現(xiàn)語(yǔ)音識(shí)別

    python調(diào)用百度REST API實(shí)現(xiàn)語(yǔ)音識(shí)別

    這篇文章主要為大家詳細(xì)介紹了python調(diào)用百度REST API實(shí)現(xiàn)語(yǔ)音識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08

最新評(píng)論