Python 生成 lambda 表达式的查找 table

Python generating a lookup table of lambda expressions

我正在构建一个游戏,为了让它运行,我需要生成一个 "pre-built" 或 "ready to call" 表达式的列表。我正在尝试使用 lambda 表达式执行此操作,但 运行 遇到了生成查找 table 的问题。我的代码类似于以下内容:

import inspect

def test(*args):
    string = "Test Function: "
    for i in args:
        string += str(i) + " "
    print(string)

funct_list = []

# The problem is in this for loop
for i in range(20):
    funct_list.append(lambda: test(i, "Hello World"))

for i in funct_list:
    print(inspect.getsource(i))

我得到的输出是:

funct_list.append(lambda: test(i, "Hello World"))
funct_list.append(lambda: test(i, "Hello World"))
funct_list.append(lambda: test(i, "Hello World"))
funct_list.append(lambda: test(i, "Hello World"))
...

我需要它去:

funct_list.append(lambda: test(1, "Hello World"))
funct_list.append(lambda: test(2, "Hello World"))
funct_list.append(lambda: test(3, "Hello World"))
funct_list.append(lambda: test(4, "Hello World"))
...

我尝试了以下两种方法,但都不起作用

for i in range(20):
    funct_list.append(lambda: test(i, "Hello World"))

for i in range(20):
    x = (i, "Hello World")
    funct_list.append(lambda: test(*x))

我的问题是如何生成 lambda 表达式列表,其中 lambda 表达式中的一些变量已经设置。

正如其他人所提到的,Python 的闭包是 后期绑定 ,这意味着来自外部作用域的变量在闭包中引用(换句话说,变量 closed over) 在闭包被调用时被查找,not 在定义时被查找。

在您的示例中,当您的 lambda 从外部范围引用变量 i 时,就会形成有问题的闭包。但是,当稍后调用您的 lambda 时,循环已经完成并使变量 i 的值为 19.

一个简单但不是特别优雅的修复方法是为 lambda 使用默认参数:

for i in range(20):
    funct_list.append(lambda x=i: test(x, "Hello World"))

与闭包变量不同,默认参数在早期绑定,因此在 lambda 定义时达到了捕获变量值 i 的预期效果。

更好的方法是使用 functools.partial,它允许您部分应用函数的一些参数,"fixing" 将它们应用到特定值:

from functools import partial

for i in range(20):
    funct_list.append(partial(lambda x: test(x, "Hello World"), i))