Python引數傳遞,既不是傳值也不是傳引用

ldzsl發表於2021-09-09

面試的時候,有沒有被問到Python傳參是傳引用還是傳值這種問題?有沒有聽到過Python傳參既不是傳值也不是傳引用這種說法?一個小小的引數預設值也可能讓程式碼出現難以查詢的bug?

如果你也遇到過上面的問題,不妨我們來探究下Python函式傳遞的種種。

才對,而實際輸出看上去好像預設引數好像只生效了一次。原因在於Python的函式也是物件(萬物皆物件),這個物件只初始化一次,加上引數又是不可變物件,所以每次呼叫實際上都修改的是一個物件。

解決這個問題,推薦再引數傳遞可變物件時,預設值設定為None,在函式內部對None進行判斷後再賦予預設值。

def test(b=None):
    b = b or []
    b += [1]
    print(b)

test()  # [1]
test()  # [1]
test()  # [1]

再看一段程式碼。

i = 1
def test(a=i):
    print(a)

i = 2
test()  # 1

由於引數預設值是在函式定義時而不是函式執行時確定的,所以這段程式碼test方法的引數預設值時1而不是2。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2325/viewspace-2800599/,如需轉載,請註明出處,否則將追究法律責任。

相關文章