在 Python 中保存函数列表

Save a list of functions in Python

提问人:Addem 提问时间:7/24/2023 更新时间:7/24/2023 访问量:49

问:

我用 Python 编写了以下代码,其目的是列出每个可能的布尔函数,该函数从集合中获取参数。因此,例如,如果 is then 应该包含四个函数。一个函数将在输入和输入时返回,另一个函数将在输入时返回,但在输入时返回,依此类推。var_setvar_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

但是,经过测试,我发现列表中的每个函数似乎都在每个输入上返回。我认为这是由于某种复制问题,就像每次采用新值一样,现在的每个函数都指向它。我尝试通过关闭来解决复制问题,因此它有Truefunc_listbucket

def f():
    return lambda x: func_list[var_list.index(x)]

但是,这并没有解决问题。但是,由于我从未在 Python 中实现过闭包,因此我不确定它们是如何工作的,并且在阅读了它们之后,我仍然看不到如何获得所需的行为。

我还尝试了几种不同的方式使用,但没有一种奏效。.hardcopy()

Python 复制 闭包

评论

1赞 John Gordon 7/24/2023
我也尝试使用.hardcopy()什么是硬拷贝?你是说深度复制吗?
0赞 Addem 7/24/2023
@JohnGordon哎呀,这可能是问题所在!
0赞 Addem 7/24/2023
@JohnGordon 呃,在尝试了几种方法之后,这似乎也不起作用。copy.deepcopy()

答:

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_listfllambda x, func_list=func_list: fuunc_list[var_list.index(x)]
0赞 Addem 7/24/2023
@FrankYellin哎呀,我不确定发生了什么——但事实上,我刚刚又试了一次(你和迈克尔的方式),现在它起作用了!我可能打错了什么,我不知道。无论如何,它现在正在工作,所以谢谢!
2赞 Frank Yellin 7/24/2023
更重要的是,你明白迈克尔为什么这样做,以及它是如何解决问题的吗?在使用外部变量的循环中定义函数时,这是一个常见的错误。