你可以循环以避免写这样的东西:lis.append( lambda: 0 )
lis.append( lambda: 1 )
lis.append( lambda: 2 )
您的目的是编写返回常量整数的lambda函数。但是您定义并附加了一个返回object i的函数。因此,3个附加函数是相同的。在
创建的函数后面的字节码返回i:
^{pr2}$
调用这些函数中的任何一个返回示例代码中i的最新值2:In [28]: lis[0]()
Out[28]: 2
如果删除i对象,则会出现一个错误:In [29]: del i
In [30]: lis[0]()
-
NameError Traceback (most recent call last)
in ()
> 1 lis[0]()
in ()
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