python函式預設引數作用域

2021-10-19 15:12:31 字數 1609 閱讀 4401

當def函式引數預設值為物件時,例如列表,字典{}

示例1:猜測一下,會輸出什麼???

def

ddd(a,b=

):return b

print

(ddd(1)

)print

(ddd(2,

['a'

,'b'

,'c'])

)print

(ddd(3)

)

[1] ['a','b','c','2'] [3]???你是否認為是這樣? 輸出一下看看

輸出結果:

[1]

['a'

,'b'

,'c',2

][1,

3]

看到以上結果有什麼想法,為什麼呢???[1, 3]而不是[3],那麼修改一下**,輸出b變數的記憶體位址看一下。我想,可以找到我要的答案

'''

'''def

ddd(a,b=

):print(id

(b))

#檢視記憶體位址

return b

print

(ddd(1)

)print

(ddd(2,

['a'

,'b'

,'c'])

)print

(ddd(3)

)

輸出結果:

170580872[1

]171586568

['a'

,'b'

,'c',2

]170580872[1

,3]

從輸出中,可以看出,除了,第二個print,其它兩個記憶體是一們的。那麼考慮一下為什麼第二個為被改變。結果顯而易見,因為第二個print改變了,b物件,重新建立了乙個物件。

那麼如果不想出現,每次呼叫,預設值物件不變的問題,可以這樣改一下:

'''

'''def

ddd(a,b=

none):

iftype

(b).__name__!=

'list'

: b =

print(id

(b))

#檢視記憶體位址

return b

print

(ddd(1)

)print

(ddd(2,

['a'

,'b'

,'c'])

)print

(ddd(3)

)

初始值設定為none,通過型別判斷來,進行內處理

小結:

1.python定義def的時候,如果引數做為物件,那麼,如果沒有改變這個物件的前提下,那麼即使,多次呼叫該函式也,不會建立新的物件。

那麼就會出現多次呼叫函式,有可能都進行了處理。

2.如果,沒有特殊需求,函式引數,盡量不採用物件,如果一有需要,物件進行內處理。傳預設值none

函式的作用域和預設引數

一 預設引數 1 不指定,就使用預設引數 stanf student 不會報錯 2 沒有預設值得引數我可以叫做必填引數 3 預設引數可以定義多個 def stamf a,b 2,c 3 4 定義函式的時候一定是必選引數在前,預設引數在後 二 可變引數 儲存在乙個元組tuple 示例 a的平方 b的平...

python 函式 引數 作用域

注意 一般 args與 kwargs一起使用,這是超級無敵萬能引數 1.常見形參模式 def func1 a1,a2 pass def func2 a1,a2 none pass def func3 args,kwargs pass 2.位置引數永遠在關鍵字引數之前 作用域中查詢資料規則 優先查詢自...

函式引數,作用域

def foo x,y,args,a 1,b,kwargs print x,y print args print a print b print kwargs foo 1,2,3,4,5,b 8,c 4,d 5 1 2 3,4,5 18 後定義的引數,必須被傳值 有預設值的除外 且必須按照關鍵字實參...