日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python中的引用和拷貝淺析

系統(tǒng) 1786 0

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ì)象所包含的所有的元素。可以使用copy.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í)知道?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 婺源县| 安西县| 普定县| 荆门市| 绥芬河市| 铁岭市| 太仓市| 深水埗区| 辽阳市| 宜川县| 安阳县| 灵寿县| 类乌齐县| 凤凰县| 丰宁| 建始县| 桃园市| 清流县| 贡嘎县| 嘉定区| 成都市| 吴忠市| 奎屯市| 丰城市| 乌鲁木齐市| 淳化县| 陈巴尔虎旗| 腾冲县| 敦化市| 武夷山市| 阿坝县| 梁河县| 平远县| 禹城市| 永丰县| 中卫市| 监利县| 宁化县| 峨眉山市| 宜黄县| 开阳县|