先看一段代碼
<code>i</code><code>=</code><code>5</code>
<code>def</code> <code>test(arg</code><code>=</code><code>i):</code>
<code> </code><code>print</code> <code>(arg)</code>
<code>i</code><code>=</code><code>6</code>
<code>test()</code>
測試一下,結果為5,這跟一般的程式設計語言結果不一樣。按照python的說法,是函數預設值隻能被指派一次,也就是說一開始arg被指派為5後,就不會再被指派了,盡管在運作函數前i被指派為6,不知道這樣了解對不對,這個要注意,很容易出錯。
下一段代碼
<code>def</code> <code>test(i,l</code><code>=</code><code>[]):</code>
<code> </code><code>l.append(i)</code>
<code> </code><code>print</code> <code>(l)</code>
<code>test(</code><code>1</code><code>)</code>
<code>test(</code><code>2</code><code>)</code>
<code>test(</code><code>3</code><code>)</code>
測試後結果為
<code>[1]</code>
<code>[1, 2]</code>
<code>[1, 2, 3]</code>
這個結果也和大部分的程式設計語言不一樣,因為l這個變量被初始為空清單,如果在函數調用中沒有再給定義,那麼後續調用過程中會累積(前面)傳給它的參數。
這是比較深入的解答:
對于傳統語言,上面這段代碼的執行方式将會是,先在記憶體中申明一個p的變量,然後将1存入變量p所在記憶體。執行加法操作的時候得到2的結果,将2這個數值再次存入到p所在記憶體位址中。可見整個執行過程中,變化的是變量p所在記憶體位址上的值
而這段代碼中,Python實際上是現在執行記憶體中建立了一個1的對象,并将p指向了它。在執行加法操作的時候,實際上通過加法操作得到了一個2的新對象,并将p指向這個新的對象。可見整個執行過程中,變化的是p指向的記憶體位址
如果想要避免這種情況,要麼不要用能夠變化的對象作為預設參數,要麼
<code>def test(i, l=None):</code>
<code> </code><code>if l is None:</code>
<code> </code><code>l = []</code>
<code> </code><code>return l</code>
本文轉自 DEAST 51CTO部落格,原文連結:http://blog.51cto.com/xudongdong/1981980