Python在heap中分配的對象分為兩類:可變對象和不可變對象。
可變對象:list,dict
不可變對象:int,float上鞠,string,tuple
在python中一切皆對象芯丧,python中的變量是指向?qū)ο蟮囊蒙盅郑斎蛔兞恳彩菍ο蟆缨恒?勺儗ο蠹安豢勺儗ο蟮母緟^(qū)別就是對象本身是否可變谴咸。
一、 不可變對象:
不可變對象的本身不可變骗露,但是變量的對象引用是可變的岭佳。請看下面的代碼:
>>> 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都指向同一塊內(nèi)存萧锉,所以i和j都指向同一個對象珊随,當我們修改j的值以后,通過id()方法得知j指向的內(nèi)存地址已經(jīng)改變柿隙。所以j改變結(jié)果后叶洞,i的結(jié)果沒有修改;int為不可變類型优俘,所以j重新賦值時京办,是重新指向了一個新的內(nèi)存地址。
二帆焕、?可變對象
可變對象的內(nèi)容是可以變化的惭婿,當對象的內(nèi)容發(fā)生變化時,變量的對象引用是不會變化的叶雹。
>>> l = [1,2]
>>> l1 = l
>>> l1.append(3)
>>>l
[1,2,3]
上面的list類型是可變類型财饥,l1和l指向同一個內(nèi)存地址,當l1發(fā)生變化時折晦,l也會隨之變化钥星。當然還有另一種情況,深拷貝满着,會新開辟一個內(nèi)存地址存放l的內(nèi)容谦炒,這種情況下修改l1的內(nèi)容,l不會隨之變化风喇。
函數(shù)的參數(shù)傳遞
由于python規(guī)定參數(shù)傳遞都是傳遞引用宁改,即傳遞給函數(shù)的是原始變量指向的內(nèi)存地址。如果修改參數(shù)的話魂莫,就會改變原始參數(shù)还蹲,但是python有可變對象和不可變對象;這就使得當傳遞的參數(shù)為可變對象時,函數(shù)內(nèi)部修改參數(shù)會影響到原始變量谜喊;當傳遞的參數(shù)為不可變對象時潭兽,函數(shù)內(nèi)部修改參數(shù)不會影響到原始變量。