python中引數傳遞
阿新 • • 發佈:2019-01-08
在程式語言中,函式的引數傳遞有兩種情況:
- 按值型別傳遞
num = 10
def double(arg):
arg=arg*2
print(arg)
double(num)
呼叫該函式,傳入一個變數,其實傳入的是該變數的一個副本,該變數在函式中發生變化,不影響函式外面該變數。
- 按引用型別(地址)傳遞
def change(arg): arg.append('More data') print(arg) saying = [42,34,55] change(saying)
呼叫該函式,傳入一個變數,但是函式內部卻是維護該變數的一個指向連結,連結到函式外面的這個變數;當傳入函式的這個變數在函式內部發生改變,直接影響到外面的最初變數,因為有指向關係。
python
中的函式引數既支援按值呼叫,也支援按引用呼叫。
python中的變數是物件引用
:變數儲存的值是記憶體地址。當函式被呼叫的時候,直譯器會檢視傳入的變數(記憶體地址)指的那個指的型別,如果是一個可變型別
的值,就按照引用傳遞變數;如果是一個非可變型別
的值,就考慮按照值傳遞變數。
可變型別
:字典dict
,列表list
,集合set
:
傳入函式中的變數,函式內部的修改都會反映到函式外面,即最初始的變數會受到影響,畢竟這些初始的變數是可變型別。
不可變型別
:字串srt
,整數int
,元組trulp
:
在這中,函式對變數的任何修改都是函式私有的,不會反映到函式外面,由於這些變數是不可變的,所以不能修改。
例外:
def double(arg):
print('before: ',arg)
arg = arg * 2
print('After: ',arg)
根據上面所說的,為什麼這個函式裡面的引數,傳入的一個可變型別,函式內部發生了改變,結果卻沒有反映到函式外面呢?
我們考慮到這條語句:arg = arg*2
首先,傳入的變數,先執行arg*2
,所產生的新的變數(新物件的引用),重新賦值給原先的變數arg
,覆蓋其原先的引用,導致原先的變數arg
與外面初始變數之間的聯絡斷了。既然關係斷了,那麼函式裡面的arg
的改變,沒有反映出來,所以並沒有影響到函式外面的變數。