提问人:Addem 提问时间:7/24/2023 更新时间:7/24/2023 访问量:49
在 Python 中保存函数列表
Save a list of functions in Python
问:
我用 Python 编写了以下代码,其目的是列出每个可能的布尔函数,该函数从集合中获取参数。因此,例如,如果 is then 应该包含四个函数。一个函数将在输入和输入时返回,另一个函数将在输入时返回,但在输入时返回,依此类推。var_set
var_set
{"P","Q"}
all_var_evals(var_set)
True
"P"
"Q"
True
"P"
False
"Q"
def all_var_evals(var_set):
# The bucket is an "accumulator" variable, into which I will place each evaluation as I
# construct them. The bucket will then be returned at the end.
bucket = []
var_list = list(var_set) # Gives the variables an indexing (ordering)
for row in range(2**(len(var_set))): # 2^n evaluations
to_bin = row
func_list = []
while to_bin != 0:
func_list.insert(0, to_bin % 2)
to_bin -= to_bin % 2
to_bin //= 2
while len(func_list) < len(var_list):
func_list.insert(0,0)
def f():
return lambda x: func_list[var_list.index(x)]
bucket.append(f())
return bucket
但是,经过测试,我发现列表中的每个函数似乎都在每个输入上返回。我认为这是由于某种复制问题,就像每次采用新值一样,现在的每个函数都指向它。我尝试通过关闭来解决复制问题,因此它有True
func_list
bucket
def f():
return lambda x: func_list[var_list.index(x)]
但是,这并没有解决问题。但是,由于我从未在 Python 中实现过闭包,因此我不确定它们是如何工作的,并且在阅读了它们之后,我仍然看不到如何获得所需的行为。
我还尝试了几种不同的方式使用,但没有一种奏效。.hardcopy()
答:
2赞
Michael Butscher
7/24/2023
#1
未测试,但尝试更换
def f():
return lambda x: func_list[var_list.index(x)]
bucket.append(f())
由
bucket.append(lambda x, fl=func_list: fl[var_list.index(x)])
评论
0赞
Addem
7/24/2023
不幸的是对我不起作用。:_(
1赞
Frank Yellin
7/24/2023
这个解决方案对我来说很好用,这正是我所建议的。您确定已更改为函数定义吗?(实际上,我会使用同样的想法。func_list
fl
lambda x, func_list=func_list: fuunc_list[var_list.index(x)]
0赞
Addem
7/24/2023
@FrankYellin哎呀,我不确定发生了什么——但事实上,我刚刚又试了一次(你和迈克尔的方式),现在它起作用了!我可能打错了什么,我不知道。无论如何,它现在正在工作,所以谢谢!
2赞
Frank Yellin
7/24/2023
更重要的是,你明白迈克尔为什么这样做,以及它是如何解决问题的吗?在使用外部变量的循环中定义函数时,这是一个常见的错误。
上一个:为什么公私保护如此重要?
下一个:泡菜蟒封口
评论
.hardcopy()
什么是硬拷贝?你是说深度复制吗?copy.deepcopy()