我无法找到key=key
在这个简单的python代码中的作用:
for key in dict:
f = (lambda key=key: print(key))
print(f())
答案 0 :(得分:3)
在这段代码中,key=key
根本没用。您也可以将循环写为
for key in [1,2,3]:
f = lambda: key
print(f())
这将打印1
,2
和3
。 (请注意 - 与问题无关 - 我还从print
删除了lambda
,而是直接返回值,因为它是多余的,只会使"外部" print
打印None
,因为该功能将使用print
返回。)
但是如果你不在循环中执行该函数,但之后呢?
functions = []
for key in [1,2,3]:
f = lambda: key
functions.append(f)
for f in functions:
print(f())
现在,这将打印3
,3
和3
,因为当函数调用时会评估key
变量,不是在定义时,即在循环之后它具有值3
。这可能会导致一些严重的意外,例如何时defining callback functions for different buttons in a loop。
在这里,使用key=key
开始发挥作用:这将创建一个参数key
,并在函数为时为其分配循环中key
变量的当前值将定义为默认值(因此在调用函数时不必传递参数)。在稍后调用函数时,key
参数的值将在函数的范围内保持不变
functions = []
for key in [1,2,3]:
f = lambda key=key: key
functions.append(f)
这会打印出1
,2
和3
,如预期的那样。正如其他人所指出的那样,您可以为参数使用不同的名称,以减少这种情况,例如: f = lambda param=key: param
。
答案 1 :(得分:2)
这段代码不简单",对于Python新手来说,理解它实际上有些棘手。
for key in dict:
只是循环遍历dict
。通常dict
是预定义的系统库类(标准字典类),并且在类对象上迭代(通常)是无意义的。
dict
绑定的内容:dict
不是关键字,而只是一个可以随意重用的常规名称 - 如果你想编写错误的python代码混淆了IDE和其他程序员。
我假设此上下文中的dict
是某种可以迭代的容器:例如,它可以是列表,元组或字典(顾名思义)。请注意,迭代字典意味着在Python中迭代字典键。
f = (lambda key=key: print(key))
此代码创建一个未命名的函数,该函数接受名为key
的参数,并将默认值定义为循环中使用的变量key
的当前值。函数体仅调用标准print
函数作为参数传递key
。
代码相当于:
f = lambda x=key: print(x)
对于新手而言可能更清楚一点,因为避免重复使用相同的名称。
最后,在每次迭代时,调用此函数不传递任何参数,并将结果发送到print
标准函数。对f()
的评估将打印key
值(不传递将使用默认值的参数),print
(即None
)的结果将打印出来第二次print
电话。
这个例子真的没什么好处的。实际上lambda x=x:...
是Python中的一种模式,有时是必要的,但这里完全是胡说八道,从这个用途中无需学习。
你应该重新考虑从你得到的来源继续阅读(我怀疑其余的也是坏事)。坚持官方教程以获得更好的例子......
答案 2 :(得分:0)
'key = key'中的第一个键是lambda函数的参数名称。第二个键是局部变量,在您的情况下是for循环变量。
因此,在每次迭代中定义一个本地键变量,然后将f定义为接收一个参数的lambda函数,其默认值与本地相同 - 因此当您激活它时,print(key)使用此默认值。
编辑: 我应该强调,在f()的上下文中,key是本地f参数,而不是for循环变量。它只是默认为循环变量的值。
编辑2: 我刚才注意到了idjaw的评论。虽然我不认为这是一个答案,但这就是你应该编写代码的方式。