1. 程式人生 > >python中引數傳遞

python中引數傳遞

在程式語言中,函式的引數傳遞有兩種情況:

  • 按值型別傳遞
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 的改變,沒有反映出來,所以並沒有影響到函式外面的變數。