python 對象引用,可變性和垃圾回收

a = [1,2,3,4]
b = a

每一個變量都有標識,類型和值.對象一旦建立,它的標識毫不會變;標識能夠簡單的理解爲對象在內存中的地址.python

  • 別名 ab 是別名指向 [1,2,3,4],若是a增長新的內容,b也會增長.
  • 相等性 b == atrue.==運算符比較連個對象的值(對象中保存的數據)
  • 標識 b is atrue,由於他們都指向 [1,2,3,4] 這個列表,is比較對象的標識

元組相對不可變性數據結構

  • 元組保存對象的引用,跟python的集合set同樣,若是引用的元素是可變的,即使元組自己不可變,元素依然可變.即:元組的不可變形其實指tuple數據結構的物理內容(即保存的引用)不可變,與引用對象無關

默認作淺層複製app

  • 淺層複製 : 1.複製了最外層容器,副本中的元素是源容器中元素的引用 2.他們的值相等,單二者指向不一樣的對象. 3.副本共享內部對象的引用
  • 淺層複製函數

    • 若全部元素都是不可變的,不存在任何問題,並節省了內存.
    • 若是存在可變的元素,如list會致使意想不到的問題.
l1 = [3,[66,55,44],(7,8,9)]
l2 = list(l1)
l1.append(100)  # 因爲只複製了外層容器,這裏僅有l1內容發生變化
l1[1].remove(55) # l1[1] 是一個list可變的元素,全部以l2[1]的元素也發生變化
l2[1] +=[33,22]
l2[2] += (10,11) # l2[2]是tuple,不可變的元素全部只有l2[2]發生變化.

深層複製,副本不共享內部對象的引用code


函數的參數做爲引用時對象

  • python中惟一支持的參數傳遞模式是共享傳參 call by sharing
  • 共享傳參:函數的各個形式參數得到實參中各個運用的副本,便是函數內部的形參是實參的別名
  • 影響:函數可能會修改做爲參數傳入的可變對象,但沒法修改那些對象的標識

不要使用可變類型做爲參數的默認值
可變參數做爲默認值會致使:若是麼有指定內容,會共用一個對象.因此一般使用Nono做爲接收可變值得參數的默認值.內存


防護可變參數rem

  • 若是定義函數的接受可變參數,應該謹慎的考慮調用方是否指望修改傳入的參數.

del和垃圾回收容器

  • 對象毫不會自行銷燬;然而,沒法獲得對象時,可能會被當作垃圾處理.一個對象的引用數量爲0的話會被銷燬
相關文章
相關標籤/搜索