python中函式值傳遞與引用傳遞

2021-10-08 01:50:49 字數 2446 閱讀 5436

簡單理解,值傳遞就是在乙個引數傳入到函式中後,函式中對該引數的操作不會影響函式外該引數的變數的值;而引用傳遞,則是引數傳遞進來的相當於記憶體位址,對該引數的操作會直接影響到外部指向其值的變數。

python中的變數沒有型別,變數相當於乙個指標,可以指向任何型別的物件,也就是變數引用了某個物件;python物件是有型別的,一般看變數是什麼型別需要看其引用的物件是什麼型別。

python中沒有嚴格的定義值傳遞與引用傳遞,總的看來,函式傳遞引數都可以看做是引用傳遞的(因為python變數相當於指標,傳遞指標就相當於傳遞了位址的引用),只不過因為python中的有些物件是不可變的,因此讓有些值傳遞的過程中又像是值傳遞的。

當python中的函式傳遞過來的是不可變的值時(比如數字常量、元組和字串),相當於c語言中的值傳遞的;若傳遞過來的引數是可變的(如列表、字典等),則相當於引用傳遞。

看個例子:

x =

10print

("xid=",id

(x))

defa

(x):

print

("axid=",id

(x))

return x

defb

(x):

x += x

return x

print

("ax="

,a(x)

)print

("bx="

,b(x)

)print

("x="

,x)

結果為:

xid=

140718279271088

axid=

140718279271088

ax=10

bx=20

x=10

當x傳遞進函式的時候,會被當作乙個區域性變數,也就是會新開闢乙個空間存放變數,該變數引用了引數的引用。因為原引數引用的是乙個不可變的物件,所以區域性變數會與函式外的變數指向同乙個記憶體區域;該區域性變數不會影響函式外的變數,但在函式內給x重新賦值的時候,會重新生成乙個物件,並讓區域性變數x指向新的物件,而外部變數x不變。因此相當於值傳遞。

x =[10

]print

("xid=",id

(x))

defa

(x):

print

("axid=",id

(x))

return x

defb

(x):

x += x

return x

print

("ax="

,a(x)

)print

("bx="

,b(x)

)print

("x="

,x)

結果為:

xid=

2769750468232

axid=

2769750468232

ax=[10]

bx=[10,

10]x=[

10,10]

原理與上面的類似,但有區別,x傳遞進函式仍然可以看作生成了乙個區域性變數x,其引用了外部變數x的引用,與不變的物件的運算不同的是,此時的x += [10] 操作,不會生成新的列表物件,而是修改了原來儲存空間中的列表物件,因此外部的x的值也會跟著改變。

下面的例子與傳遞不可變引數時是一樣的:

x =[10

]print

("xid=",id

(x))

defa

(x):

print

("axid=",id

(x))

return x

defb

(x):

x =[10

,10]print

("bxid",id

(x))

return x

print

("ax="

,a(x)

)print

("bx="

,b(x)

)print

("x="

,x)

結果為:

xid=

2769750458632

axid=

2769750458632

ax=[10]

bxid 2769750460616

bx=[10,

10]x=[

10]

這裡是因為賦值號=生成了新的列表導致了區域性變數x指向了新的物件,原物件不變。

python中的值傳遞與引用傳遞是乙個相對的概念,原值有沒有變化關鍵在原來的變數引用的物件有沒有發生改變,而這些需要根據變數引用的物件來判斷。

C 函式引數 值傳遞與引用傳遞

以前我們在c語言中函式引數傳遞過程中,如果我們想要讓當a函式作用域中的變數經過b函式處理之後的數值仍然在a函式中生效,這個時候函式引數的傳遞時需要引用方式去傳遞,方式如下 include 函式引數為指標,通過修改指標裡面的內容達到對main中b變數的修改 void func int a int ma...

JS中函式引數值傳遞和引用傳遞

也許大家對於函式的引數都不會太在意,簡單來說,把函式外部的值複製給函式內部的引數,就和把值從乙個變數複製到另乙個變數一樣。深入研究,你會發現其實沒那麼簡單,這個傳參是要分倆種情況 其實這是個錯誤的說法,ecmascript中所有函式的引數都是按值傳遞的 高程3 原話,之所以這裡說倆種,是因為結合引用...

JS中函式引數值傳遞和引用傳遞

自 1 按值傳遞 1 function addten num 5 6 var count 20 7 var result addten count 按值傳遞 num count 8 alert count 20,沒變化 9 alert result 30 很好理解,因為是按值傳遞的,傳遞完後倆個變數...