天天看點

關于Python函數的一些問題

先看一段代碼

i=5
def test(arg=i):
    print (arg)
i=6
test()      

測試一下,結果為5,這跟一般的程式設計語言結果不一樣。按照python的說法,是函數預設值隻能被指派一次,也就是說一開始arg被指派為5後,就不會再被指派了,盡管在運作函數前i被指派為6,不知道這樣了解對不對,這個要注意,很容易出錯。

下一段代碼

def test(i,l=[]):
    l.append(i)
    print (l)
test(1)
test(2)
test(3)      

測試後結果為

[1]
[1, 2]
[1, 2, 3]      

這個結果也和大部分的程式設計語言不一樣,因為l這個變量被初始為空清單,如果在函數調用中沒有再給定義,那麼後續調用過程中會累積(前面)傳給它的參數。

這是比較深入的解答:

對于傳統語言,上面這段代碼的執行方式将會是,先在記憶體中申明一個p的變量,然後将1存入變量p所在記憶體。執行加法操作的時候得到2的結果,将2這個數值再次存入到p所在記憶體位址中。可見整個執行過程中,變化的是變量p所在記憶體位址上的值

而這段代碼中,Python實際上是現在執行記憶體中建立了一個1的對象,并将p指向了它。在執行加法操作的時候,實際上通過加法操作得到了一個2的新對象,并将p指向這個新的對象。可見整個執行過程中,變化的是p指向的記憶體位址

如果想要避免這種情況,要麼不要用能夠變化的對象作為預設參數,要麼

def test(i, l=None):
    if l is None:
        l = []
    l.append(i)
    return l