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

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 可變類型,例如 list,set,自定義類型(等價(jià)于C#中的引用類型);

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

一、引用和拷貝(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ì)象,但是使用原來對(duì)象的元素的引用(如果是不變類型,相當(dāng)于是拷貝)來填充新對(duì)象。可以使用copy.copy()來實(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è)?。所以修改其中一個(gè)list對(duì)象中的元素,另一個(gè)list對(duì)象也會(huì)被修改。

深拷貝創(chuàng)建一個(gè)新的對(duì)象,同時(shí)遞歸地拷貝對(duì)象所包含的所有的元素??梢允褂胏opy.deepcopy()來實(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

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

相關(guān)文章

最新評(píng)論

岐山县| 乌鲁木齐县| 青岛市| 双桥区| 蓝田县| 顺昌县| 滨州市| 绍兴市| 修武县| 手机| 新乡市| 民勤县| 垦利县| 云安县| 东乡族自治县| 新干县| 绥江县| 志丹县| 汤原县| 鹤山市| 北碚区| 新闻| 澎湖县| 平凉市| 遂平县| 绵阳市| 睢宁县| 红河县| 辉县市| 永善县| 普兰县| 家居| 龙泉市| 思茅市| 贵定县| 大名县| 保定市| 昌邑市| 郸城县| 台州市| 阜康市|