Python 函式的引數 預設引數

2021-08-15 01:31:12 字數 1322 閱讀 9156

預設引數很有用,但使用不當,也會掉坑里。預設引數有個最大的坑,演示如下:

先定義乙個函式,傳入乙個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 預設引數 Python預設引數有坑?

最近有小夥伴在面試中遇到了 關於函式預設引數的坑 的題目,少數夥伴對此問題理得不是太清楚,今天匯智妹請到匯智動力高階教師鄧老師為大家詳細講解一下,幫助不太清楚的小夥伴清晰的梳理一遍。鄧老師本次主要從以下三點來講解 什麼是預設引數?函式預設引數的坑是什麼?函式預設引數為什麼會有坑?一 什麼是預設引數 ...

Python函式引數型別與預設引數

目錄 可變引數 可變位置引數 可變關鍵字引數 混合使用 強制關鍵字引數 預設引數 python函式的引數非常靈活 不同型別的引數,定義時順序很重要 必須按以下順序給出不同型別引數 def func positional args,keyword args,tuple grp args,dict kw...

C (帶有預設引數的函式引數)預設函式引數

預設引數?在c 中,允許實參的個數與形參的個數不同。在宣告函式原型時,為乙個或者多個形參指定預設值,以後呼叫這個函式時,若省略某乙個實參,c 則自動的以預設值作為相應引數的值。實列說明 includeusing namespace std int add int x 4,int y 7 int ma...