1. 程式人生 > >Python中的的函式的引數傳遞

Python中的的函式的引數傳遞

2017.10.10更新,如果用字典傳參,關鍵字引數等等,用get獲取值比用index更好,Python 字典(Dictionary) get() 函式返回指定鍵的值,如果值不在字典中返回預設值或者None

def sum1(item,a=[]):
    a.append(item)
    return a

如果這麼定義函式的引數,因為a指向[]這個空列表物件,以後每次呼叫這個函式都會呼叫這個指向同一個空列表物件的引數,造成資料異常!!!比如呼叫同一函式兩次得到不同資料

>>> print sum1('one')
['one']
>>> print sum1('one'
) ['one', 'one']

這裡寫圖片描述
怎麼改?
正確的方式是,把引數預設值指定為None

def sum1(item,a=None):
    if a=None:
        a = []
    a.append(item)
    return a

這裡寫圖片描述

這裡記住的是型別是屬於物件的,而不是變數。而物件有兩種,“可更改”(mutable)與“不可更改”(immutable)物件。在python中,strings, tuples, 和numbers是不可更改的物件,而list,dict等則是可以修改的物件。(這就是這個問題的重點)

當一個引用傳遞給函式的時候,函式自動複製一份引用,這個函式裡的引用和外邊的引用沒有半毛關係了.所以第一個例子裡函式把引用指向了一個不可變物件,當函式返回的時候,外面的引用沒半毛感覺.而第二個例子就不一樣了,函式內的引用指向的是可變物件,對它的操作就和定位了指標地址一樣,在記憶體裡進行修改.