Python在heap中分配的對象分為兩類:可變對象和不可變對象。
可變對象:list,dict
不可變對象:int,float,string,tuple
在python中一切皆對象,python中的變量是指向對象的引用,當然變量也是對象。可變對象及不可變對象的根本區別就是對象本身是否可變。
一、 不可變對象:
不可變對象的本身不可變,但是變量的對象引用是可變的。請看下面的代碼:
>>> i = 2
>>> j = i
>>> i is j
True
>>> id(i)? ? ? ? ? ? #32897624
>>> id(j)? ? ? ? ? #32897624
>>> j += 1
>>>id(j)? ? ? ? #32897612
>>> i is j
False
一開始i和j的值都為1,通過id()方法得知i和j都指向同一塊內存,所以i和j都指向同一個對象,當我們修改j的值以后,通過id()方法得知j指向的內存地址已經改變。所以j改變結果后,i的結果沒有修改;int為不可變類型,所以j重新賦值時,是重新指向了一個新的內存地址。
二、?可變對象
可變對象的內容是可以變化的,當對象的內容發生變化時,變量的對象引用是不會變化的。
>>> l = [1,2]
>>> l1 = l
>>> l1.append(3)
>>>l
[1,2,3]
上面的list類型是可變類型,l1和l指向同一個內存地址,當l1發生變化時,l也會隨之變化。當然還有另一種情況,深拷貝,會新開辟一個內存地址存放l的內容,這種情況下修改l1的內容,l不會隨之變化。
函數的參數傳遞
由于python規定參數傳遞都是傳遞引用,即傳遞給函數的是原始變量指向的內存地址。如果修改參數的話,就會改變原始參數,但是python有可變對象和不可變對象;這就使得當傳遞的參數為可變對象時,函數內部修改參數會影響到原始變量;當傳遞的參數為不可變對象時,函數內部修改參數不會影響到原始變量。