簡體   English   中英

為什么函數定義中的默認變量為1?

[英]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

您的函數定義將不起作用,因為您已定義默認參數的方式。 Python的默認參數在定義函數時被計算一次,而不是每次調用函數時(比如Ruby)。 這意味着如果你使用一個可變的默認參數並對其進行變異,那么你將為該函數的所有未來調用改變該對象。 您的程序將無法正常工作,如下所示!

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM