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))
我正在构建一个游戏,为了让它运行,我需要生成一个 "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))