最新国产好看的视频,伊人天堂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ì)象,但是使用原來(lái)對(duì)象的元素的引用(如果是不變類型,相當(dāng)于是拷貝)來(lái)填充新對(duì)象??梢允褂胏opy.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è)?。所以修改其中一個(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í)知道?

相關(guān)文章

最新評(píng)論

故城县| 广汉市| 红安县| 当阳市| 泗阳县| 宁远县| 中卫市| 凉城县| 赤城县| 仙游县| 石首市| 南川市| 永宁县| 谷城县| 余江县| 福州市| 诏安县| 大余县| 张北县| 左贡县| 阿克陶县| 博爱县| 桑植县| 枣庄市| 新昌县| 淅川县| 高阳县| 大理市| 广饶县| 安泽县| 梁山县| 海盐县| 印江| 永德县| 泰宁县| 莫力| 东台市| 化隆| 睢宁县| 麦盖提县| 浦江县|