a = [1,2,3,4] b = a
每一個變量都有標識,類型和值.對象一旦建立,它的標識毫不會變;標識能夠簡單的理解爲對象在內存中的地址.python
a
跟 b
是別名指向 [1,2,3,4]
,若是a增長新的內容,b也會增長. b == a
爲 true
.==
運算符比較連個對象的值(對象中保存的數據)b is a
爲true
,由於他們都指向 [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的話會被銷燬