預設引數必須指向不變物件!

2021-08-03 23:40:11 字數 1312 閱讀 9284

python設定預設引數有個最大的坑,演示如下:

先定義乙個函式,傳入乙個list,新增乙個end再返回:

def

add_end

(l=):

return l

當你正常呼叫時,結果似乎不錯:

>>> add_end([1, 2, 3])

[1, 2, 3, 'end']

>>> add_end(['x', 'y', 'z'])

['x', 'y', 'z', 'end']

當你使用預設引數呼叫時,一開始結果也是對的:

>>> add_end()

['end']

但是,再次呼叫add_end()時,結果就不對了:

>>> add_end()

['end', 'end']

>>> add_end()

['end', 'end', 'end']

預設引數是,但是函式似乎每次都「記住了」上次新增了'end'後的list。

原因解釋如下:

python函式在定義的時候,預設引數l的值就被計算出來了,即,因為預設引數l也是乙個變數,它指向物件,每次呼叫該函式,如果改變了l的內容,則下次呼叫時,預設引數的內容就變了,不再是函式定義時的了。

所以,定義預設引數要牢記一點:預設引數必須指向不變物件!

要修改上面的例子,我們可以用none這個不變物件來實現:

def

add_end

(l=none):

if l is

none:

l =

return l

現在,無論呼叫多少次,都不會有問題:

>>> add_end()

['end']

>>> add_end()

['end']

為什麼要設計strnone這樣的不變物件呢?

因為不變物件一旦建立,物件內部的資料就不能修改,這樣就減少了由於修改資料導致的錯誤。此外,由於物件不變,多工環境下同時讀取物件不需要加鎖,同時讀一點問題都沒有。我們在編寫程式時,如果可以設計乙個不變物件,那就盡量設計成不變物件。

Python def函式的必須引數和預設引數

在學習其他 時,發現函式這塊學的不紮實,了解的不透視,所以再來學習一下。coding utf 8 定義1個函式,age有預設值35,work有預設值 空 def printinfo name,age 35 work 根據work的是否為空,分別列印不同格式 title首字母,upper全部大寫,lo...

為什麼python預設引數一定要指向不可變物件

python語言中,函式的預設引數必須指向不可變物件。舉個簡單的例子 def test l return l print test print test print test 得到的結果是 a a a a a a 原因就在於函式的預設引數在函式定義時就已經被計算出來了,也就是l指向的記憶體位置已經確...

es6 函式預設引數 物件

注意引數是物件,並且等號左邊是解構後的變數,用等號賦值,右邊是引數,也就是正常的變數,所以物件用冒號給值 案例1 是對解構後的變數給預設值 function move 沒什麼好說的 console.log move 3,8 引數直有乙個x,所以解構後沒有y則使用預設 console.log move...