1. 程式人生 > >關於Python函數的一些問題

關於Python函數的一些問題

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


本文出自 “Deast的窩” 博客,請務必保留此出處http://xudongdong.blog.51cto.com/1889083/1981980

關於Python函數的一些問題