預設引數問題

2021-08-24 20:43:48 字數 1659 閱讀 6481

如果在呼叫乙個函式時,沒有傳遞預設引數,則函式內的預設引數是對函式的預設引數屬性__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=):

if(arg1==):

print 'arg1 is empty'

arg1=

else:

print 'arg1 is not empty'

print arg1

上例中,在使用者沒有傳遞預設引數arg1時,函式內部會給arg1變數重新賦值,讓arg1去引用我們想用的物件,這樣arg1就不會修改func.__defaults__了

如果是預設引數是有值的情況,可以這樣操作

def func(arg1=[1,2,3]):

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

以上太囉嗦,下例模仿了python官方例子,使用不可變型別(例如none)作為預設引數,邏輯簡潔,推薦使用

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預設引數有坑?

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