Python 为什么在函数定义中默认变量被1关闭?

Python 为什么在函数定义中默认变量被1关闭?,python,lambda,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 ... >

我发现了一个有趣的问题,为什么要尝试对代码高尔夫挑战执行以下操作:

>>> 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
,为什么会发生这种情况?

除非已声明变量,否则不能在lambda表达式中使用赋值。在您的例子中,变量
s
之前是如本文所述声明的,因为
z
在运行时被绑定,所以它使用了
s
的值

演示:

如您所见,如果在lambda表达式中使用
a=a
,则
a
值将在定义时绑定,并且更改该值不会产生任何效果,这与您的情况相同

您应该如下更改lambda表达式:

>>> f = lambda s: 5 + len(s)
>>> f('horse')
10
python文档

函数运行时,Python的默认参数只计算一次 已定义,而不是每次调用函数时


在您的情况下,
s
必须在创建lambda函数之前已绑定到长度为6的字符串。当python使用
z=len(s)
计算lambda定义时,它的计算结果为
z=6
。它不会在每次调用函数时再次被处理。

函数定义将不起作用,因为您定义默认参数的方式。Python的默认参数在定义函数时计算一次,而不是每次调用函数时(比如Ruby)。这意味着,如果您使用一个可变的默认参数并对其进行了变异,那么您将并且已经对该对象进行了变异,以便将来调用该函数。您的程序将无法像下面看到的那样工作


你不能那样做<代码>s在函数定义时不存在。这在这个特定的REPL会话之外不起作用。你以前已经声明了一个
s
啊,是的,现在开始一个新会话会导致这个抛出一个
NameError
你想要的是
f=lambda s:5+len(s)
@user3100115,这是一个代码高尔夫,所以我用它来尝试获取一个命名变量
z
,而不在新行中声明它。
>>> f = lambda s: 5 + len(s)
>>> f('horse')
10