簡單理解,值傳遞就是在乙個引數傳入到函式中後,函式中對該引數的操作不會影響函式外該引數的變數的值;而引用傳遞,則是引數傳遞進來的相當於記憶體位址,對該引數的操作會直接影響到外部指向其值的變數。
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 很好理解,因為是按值傳遞的,傳遞完後倆個變數...