Python函式預設引數導致的BUG

2021-12-29 19:41:03 字數 483 閱讀 8727

最近在乙個多執行緒網路伺服器程式中, 發現資料經常錯亂, 而且, 錯亂的資料是結構化的, 並不是字串錯亂. 最後, 才發現是傳送函式使用了預設引數, 而且引數的型別不是原始型別, 而是乙個列表.

可以這樣重現:

def oh_my_god(a=):

a.append(1)

print a

oh_my_god()

oh_my_god()

oh_my_god()

輸出:[1]

[1, 1]

[1, 1, 1]

這一切的原因是由於python的函式定義也是乙個物件, 每一次函式呼叫都是呼叫同乙個物件, 而函式引數則是這個物件的一些屬性! 呼叫函式時, 先獲取函式物件的屬性, 判斷是否有預設值.

那就這樣說吧:本質上, python不支援函式預設引數為非原始型別! 因為非原始型別的預設引數被當作c語言的函式內靜態變數. 也怪我沒注意看手冊裡的」important warning」…

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 當...

python 預設引數 Python預設引數有坑?

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

Python函式預設引數值

python的函式機制提供了可選引數的功能,可選引數需要放在引數列表的後幾個引數。當呼叫這些函式時,如果不想設定這些引數,就可以不用設定而直接使用函式定義的時候設定的引數預設值。同樣的,呼叫函式的時候也可以重新設定引數,這將覆蓋預設設定的引數。def func x,y 2 print x y fun...