關於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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章