預設引數只會在函式定義時被確定。
對比兩個函式
a = [lambda :x for x in range(10)]
. print(a[0]())
. print(a[9]())
b = [lambda n=x:n for x in range(10)]
. print(b[0]())
. print(b[9]())
函式a是乙個列表推倒式,for x in range(10), 表示要生成10個lambda函式,a[0]代表生成的第乙個函式,a[9]代表生成的第十個函式,a0~9表示呼叫這些函式。
函式b也是乙個列表推導式,同樣表示要生成10個lambda函式,a[0]代表生成的第乙個函式,a[9]代表生成的第十個函式,a0~9表示呼叫這些函式。
那麼為什麼a0,和b0的結果不相同呢?因為lambda函式有所區別,a中的lambda函式沒有引數,直接返回x;而b中lambda函式有預設引數,預設引數n=x,並且返回n。
前面說了,都是先利用for x in range(10)
生成十個函式(a,b函式的引數不同),再呼叫函式。a沒有引數,a函式結果在每次呼叫函式時返回,而在生成這十個函式之後x的值已經為9,所以在呼叫函式時,x的值已經為9,十個函式都是返回9。而b函式引數為預設引數,預設引數只會在函式定義時被確定,所以在進行for迴圈去生成10個lambda函式時,生成的是10個不同的函式,即lambda n=0~9:n
,所以在呼叫函式時,自然返回不同的值
Python 可變型別作為函式預設引數時的副作用
在 python 中定義函式時,可以為其指定預設引數,這樣就不必在每次呼叫函式時都傳遞引數進去,並且可以簡化我們的 在定義函式時,如果使用了可變型別來作為函式的預設引數,往往會產生一些 來看下面一段 def foo li 1 print li foo foo foo 你可能想得到如下的結果 1 1 ...
python定義函式時預設引數注意事項
如果在呼叫乙個函式時,沒有傳遞預設引數,則函式內的預設引數是對函式的預設引數屬性 defaults 的引用,如def func arg1 呼叫func時如果沒有傳參,上面的arg1就是func.defaults 0 的引用 沒傳遞預設引數,會發生以下情況 這樣在有些情況下會導致邏輯出錯的,例如 de...
python定義函式時預設引數注意事項
如果在呼叫乙個函式時,沒有傳遞預設引數,則函式內的預設引數是對函式的預設引數屬性 defaults 的引用,如呼叫func時如果沒有傳參,上面的arg1就是func.defaults 0 的引用 沒傳遞預設引數,會發生以下情況 這樣在有些情況下會導致邏輯出錯的,例如 func arg1 is not...