python函式預設引數為可變物件的理解

2022-05-17 04:58:38 字數 1678 閱讀 9832

1.**在執行的過程中,遇到函式定義,初始化函式生成儲存函式名,預設引數初識值,函式位址的函式物件。

2.**執行不在初始化函式,而是直接執行函式體。

**例項

這要從函式的特性說起,在 python 中,函式是第一類物件(function is the first class object),換而言之,函式也是物件,跟整數、字串一樣可以賦值給變數、當做引數傳遞、還可以作為返回值。函式也有自己的屬性,比如函式的名字、函式的預設引數列表。

# 函式的名字

>>> func.__name__

'func'

# 函式的預設引數列表

>>> func.__defaults__

([ 1, 1, 1, 1, 1], 1)

def是一條可執行語句,python 直譯器執行 def 語句時,就會在記憶體中就建立了乙個函式物件(此時,函式裡面的**邏輯並不會執行,因為還沒呼叫嘛),在全域性命名空間,有乙個函式名(變數叫 func)會指向該函式物件,記住,至始至終,不管該函式呼叫多少次,函式物件只有乙個,就是function object,不會因為呼叫多次而出現多個函式物件。

函式物件生成之後,它的屬性:名字和預設引數列表都將初始化完成。

初始化完成時,屬性 __default__ 中的第乙個預設引數 numbers 指向乙個空列表。

當函式第一次被呼叫時,就是第一次執行 func()時,開始執行函式裡面的邏輯**(此時函式不再需要初始化了),**邏輯就是往numbers中新增乙個值為1的元素

第二次呼叫 func(),繼續往numbers中新增乙個元素

第三次、四次依此類推。

所以現在你應該明白為什麼呼叫同乙個函式,返回值確每次都不一樣了吧。因為他們共享的是同乙個列表(numbers)物件,只是每呼叫一次就往該列表中增加了乙個元素

如果我們顯示地指定 numbers 引數,結果截然不同。

因為numbers被重新賦值了,它不再指向原來初始化時的那個列表了,而是指向了我們傳遞過去的那個新列表物件,因此返回值變成了 [10, 11, 1]

那麼我們應該如何避免前面那種情況發生呢?就是不要用可變物件作為引數的預設值。

正確方式:

>>> deffunc(numbers=none, num=1):

... ifnumbers isnone:

... numbers = [num]

... else:

... returnnumbers

Python 函式 可變引數

有些時候我們可能遇到引數的個數並不固定的情況,比如1 2 3 n 函式定義如下 def calc numbers sum 0 for n in numbers sum sum n n return sum上面這種情況只能傳乙個引數,而且引數一般是list或tuple,呼叫方式 calc 1,3,5 ...

Python語言入門(五)函式與預設引數 可變引數

coding utf 8 在python中,功能可以函式為單位進行封裝。定義乙個函式需要用到def關鍵字,但因為python是動態型別的語言,因此函式不需要宣告返回值型別。以下是乙個普通函式的宣告和呼叫。def sayhello yourname if yourname none print 你好!...

python函式的預設引數請勿定義可變型別

經常會看到這樣一句 警告 default argument value is mutable 意思是告訴我們函式的定義中,使用可變型別做預設引數。那為什麼會有這個警告呢?可變型別 mutable 列表,字典 不可變型別 unmutable 數字,字串,元組 def fun a 1 print a i...