![](/img/trans.png)
[英]Why using max in a function require specific definition of a variable in the function?
[英]Why is default variable off by one in function definition?
我發現了一個有趣的問題,為什么要嘗試為代碼高爾夫挑戰做以下事情:
>>> f=lambda s,z=len(s): 5+z
>>> f("horse")
11 #Expected 10
>>>
>>> def g(s,z=len(s)):
... print "z: ", z
... print "sum: ", 5+z
...
>>> g("horse")
z: 6
sum: 11
>>>
>>> len("horse") + 5 #Expected function operation
10
兩種方式創建函數似乎將z
初始化為6
而不是預期的5
,為什么會發生這種情況?
python文檔有一個解釋這個的頁面
定義函數時,Python的默認參數將被計算一次,而不是每次調用函數時
在您的情況下,在創建lambda函數之前, s
必須已經綁定到長度為6的字符串。 當python使用z=len(s)
計算lambda定義時,它計算為z=6
。 每次調用該函數時都不會再次處理它。
除非已經聲明了變量,否則不能在lambda表達式中使用賦值。 在您的情況下,變量s
先前已在此注釋中聲明,並且因為z
在運行時綁定,所以它使用了s
值。
演示:
>>> a = 9
>>> f = lambda b: a + b
>>> f(3)
12
>>> a = 11
>>> f(3)
14
>>> f = lambda b, a=a: a + b # "a" gets bound to previous value 11
>>> f(3)
14
>>> a = 3 #
>>> f(3)
14
正如你可以看到,如果你使用a=a
在lambda表達式a
值被定義在時間限制和改變值不具有你的情況發生了什么任何影響。
您應該像這樣更改lambda表達式:
>>> f = lambda s: 5 + len(s)
>>> f('horse')
10
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.