如果在呼叫乙個函式時,沒有傳遞預設引數,則函式內的預設引數是對函式的預設引數屬性__defaults__的引用, –
-自己的理解,讓我聯想到賦值,淺拷貝,這裡是淺拷貝,改變args的值,不會影響__defaults__[0]的值,但是改變args子物件的值,會同時讓__defaults__[0]的子物件發生變化,即_defaults__[0]也發生了變化 ————————————————————————
如
def func(arg1=):呼叫func時如果沒有傳參,上面的arg1就是func.__defaults__[0]的引用
沒傳遞預設引數,會發生以下情況
這樣在有些情況下會導致邏輯出錯的,例如
def func(arg1=):
if(arg1==):
print 'arg1 is empty'
else:
print 'arg1 is not empty'
print arg1
func() # arg1 is empty
func() #arg1 is not empty [1]第二次呼叫func的時候,並沒有傳遞引數arg1,但是第一次呼叫時,函式內部已經修改了__defaults__
這是為啥呢?為何第二次呼叫不重置arg1為?
因為python的預設引數只會在函式定義時被確定,而不是每次呼叫時重新確定,所以,一旦在函式中修改了預設引數,則再隨後的呼叫中都會生效
由於有這個特性,在定義函式時,如果預設引數使用可變的物件型別,如上例子,則很可能導致邏輯出錯,
所以,如不是特別需要,則不允許在函式內部對預設引數引用的func.__defaults__屬性進行修改,如何能讓乙個物件不被修改?那就是在操作arg1前取消它對__defaults__的引用
以上例子改動一下
def func(arg1=):上例中,在使用者沒有傳遞預設引數arg1時,函式內部會給arg1變數重新賦值,讓arg1去引用我們想用的物件,這樣arg1就不會修改func.__defaults__了if(arg1==):
print 'arg1 is empty'
arg1=
else:
print 'arg1 is not empty'
print arg1
如果是預設引數是有值的情況,可以這樣操作
def func(arg1=[1,2,3]):以上太囉嗦,下例模仿了python官方例子,使用不可變型別(例如none)作為預設引數,邏輯簡潔,推薦使用if(arg1==[1,2,3]):
print 'is [1,2,3]'
arg1=[1,2,3] #重點是這裡,取消arg1對__defaults__屬性的引用,防止arg1修改__defaults__
else:
print 'not [1,2,3]'
print arg1
to = [1,2,3]
return to
總結:防止預設引數修改函式的__defaults__,需要:
1.定義預設引數時,最好使用不可變型別.
2.如果預設引數一定要使用可變型別,那就在函式內部對預設引數重新賦值為可變型別的具體值.
python 預設引數問題
首先來看問題 def add end l return l t add end t end t add end t end end t add end 1 t 1,end t add end t end end end t add end 1 t 1,end t add end t end end ...
Python預設引數陷阱問題
def fun a,l print l fun hhh fun mmmm fun xingkd python中的def語句在每次執行的時候都初始化乙個函式物件,這個函式物件就是我們要呼叫的函式,可以把它當成乙個一般的物件,只不過這個物件擁有乙個可執行的方法和部分屬性,對於引數中提供了初始值的引數,由...
python 預設引數 Python預設引數有坑?
最近有小夥伴在面試中遇到了 關於函式預設引數的坑 的題目,少數夥伴對此問題理得不是太清楚,今天匯智妹請到匯智動力高階教師鄧老師為大家詳細講解一下,幫助不太清楚的小夥伴清晰的梳理一遍。鄧老師本次主要從以下三點來講解 什麼是預設引數?函式預設引數的坑是什麼?函式預設引數為什麼會有坑?一 什麼是預設引數 ...