當(dāng)變量為不可變對(duì)象時(shí),函數(shù)調(diào)用是值傳遞
當(dāng)變量為可變對(duì)象時(shí),函數(shù)調(diào)用是引用傳遞
 
什么是值傳遞:
值傳遞過程中,被函數(shù)調(diào)用的形參被作為函數(shù)的局部變量處理,也就是在堆棧中開辟了內(nèi)存空間以存放由主調(diào)用函數(shù)放進(jìn)來的實(shí)參的值,從而成為了實(shí)參的一個(gè)副本
值傳遞的特點(diǎn)是被調(diào)用函數(shù)對(duì)形參的任何操作都是作為局部變量進(jìn)行,不會(huì)影響主函數(shù)的實(shí)參變量的值
def test1(c):
    print "test before"
    print id(c)
    c+=1print "test after "
    print id(c)
    return c

>>> c = 1
>>> test1(c)
>>> print c
1

 

什么是引用傳遞:
引用傳遞過程中,被調(diào)用函數(shù)的形參雖然也被作為局部變量在堆棧中開辟了內(nèi)存空間,但是這時(shí)存放的是由主調(diào)用函數(shù)放進(jìn)來的實(shí)參變量的地址,被調(diào)用函數(shù)對(duì)形參的任何操作都被處理成間接尋址,也就是通過堆棧中存放的地址訪問主調(diào)用函數(shù)的實(shí)參變量,這樣會(huì)影響主調(diào)用函數(shù)中的實(shí)參的值。
def test2(c):
    print "test before"
    print id(c)
    c.appned("1")
    print "test after "
    print id(c)
    return c

>>> c = [1]
>>> test2(c)
>>> print c
[1, "1"]
 
 
結(jié)論:python 不允許程序員選擇采用傳值還是傳引用,Python參數(shù)傳遞采用的是”傳對(duì)象引用“的方式,
這種方式相當(dāng)于傳值和傳引用的一種綜合。
1)如果函數(shù)收到的是一個(gè)可變對(duì)象(list , dict)的引用,就能修改對(duì)象的原始值,這相當(dāng)于通過”傳引用“來傳遞對(duì)象。
2)如果函數(shù)收到的是一個(gè)不可變對(duì)象,(int, tuple)的引用,就不能直接修改原始對(duì)象,相當(dāng)于通過”傳值“來傳遞對(duì)象