为什么函数定义中的默认变量为1?

wnn*_*maw 4 python lambda

我发现了一个有趣的问题,为什么要尝试为代码高尔夫挑战做以下事情:

>>> 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 
Run Code Online (Sandbox Code Playgroud)

创建功能两种方式似乎初始化z6,而不是预期的5,为什么会出现这种情况?

Bre*_*bel 5

python文档有一个解释这个的页面

定义函数时,Python的默认参数将被计算一次,而不是每次调用函数时

在您的情况下,s在创建lambda函数之前,必须已经绑定了一个长度为6的字符串.当python评估lambda定义时z=len(s),它将被计算为z=6.每次调用该函数时都不会再次处理它.