gpt4 book ai didi

python - lambda函数及其参数的范围?

转载 作者:IT老高 更新时间:2023-10-28 21:32:38 26 4
gpt4 key购买 nike

我需要一个对一系列 gui 事件几乎完全相同的回调函数。根据调用它的事件,该函数的行为会略有不同。对我来说似乎是一个简单的案例,但我无法弄清楚 lambda 函数的这种奇怪行为。

所以我在下面有以下简化代码:

def callback(msg):
print msg

#creating a list of function handles with an iterator
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(m))
for f in funcList:
f()

#create one at a time
funcList=[]
funcList.append(lambda: callback('do'))
funcList.append(lambda: callback('re'))
funcList.append(lambda: callback('mi'))
for f in funcList:
f()

这段代码的输出是:

mi
mi
mi
do
re
mi

我预计:

do
re
mi
do
re
mi

为什么使用迭代器会搞砸?

我尝试过使用 deepcopy:

import copy
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(copy.deepcopy(m)))
for f in funcList:
f()

但这也有同样的问题。

最佳答案

创建 lambda 时,它不会复制它使用的封闭范围内的变量。它维护对环境的引用,以便以后可以查找变量的值。只有一个m。每次循环都会分配给它。在循环之后,变量 m 的值是 'mi'。因此,当您实际运行稍后创建的函数时,它会在创建它的环境中查找 m 的值,届时该值将具有值 'mi'

此问题的一个常见且惯用的解决方案是在创建 lambda 时捕获 m 的值,方法是将其用作可选参数的默认参数。您通常使用同名参数,因此您不必更改代码主体:

for m in ('do', 're', 'mi'):
funcList.append(lambda m=m: callback(m))

关于python - lambda函数及其参数的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/938429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com