In [29]: del i
In [30]: lis[0]()
-
NameError Traceback (most recent call last)
<ipython-input-30-c9e334d64652> in <module>()
> 1 lis[0]()
<ipython-input-18-15df6d11323a> in <lambda>()
1 lis = []
2 for i in range(3):
> 3 lis.append( lambda: i )
NameError: global name 'i' is not defined
解决方案可能是继续使用循环来编写包含所需常量的代码,并实际运行该代码:
In [31]: lis = []
...: for i in range(3):
...: exec 'lis.append( lambda: {} )'.format(i)
...:
结果如下:
In [44]: lis[0]()
Out[44]: 0
In [45]: lis[1]()
Out[45]: 1
In [46]: dis.dis(lis[0])
1 0 LOAD_CONST 1 (0)
3 RETURN_VALUE
In [47]: dis.dis(lis[1])
1 0 LOAD_CONST 1 (1)
3 RETURN_VALUE
你可以循环以避免写这样的东西:
您的目的是编写返回常量整数的lambda函数。但是您定义并附加了一个返回object
i
的函数。因此,3个附加函数是相同的。在创建的函数后面的字节码返回
^{pr2}$i
:调用这些函数中的任何一个返回示例代码中
i
的最新值2
:如果删除
i
对象,则会出现一个错误:解决方案可能是继续使用循环来编写包含所需常量的代码,并实际运行该代码:
结果如下:
@Boud给出了一个非常好的答案,解释了为什么你的代码不能像你期望的那样工作。重要的是,在lambda中引用
i
之前,必须计算它的值。下面是一个有点老套的方法:这使用了Python的默认函数参数值特性,例如在函数中可以写下:
^{pr2}$现在,诀窍是在创建函数(方法、lambda表达式)时,将参数的默认值存储在该点。因此:
同样的伎俩也适用于lambda。为了更清楚一点:
相关问题 更多 >
编程相关推荐