關於Python函數的一些問題
阿新 • • 發佈:2017-11-15
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函數的一些問題