【问题标题】:Avoid objects from pointing to the same underlying object [duplicate]避免对象指向同一个底层对象[重复]
【发布时间】:2020-06-26 19:00:50
【问题描述】:

有人能解释一下为什么在下面的例子中所有函数在运行后都是一样的吗?有没有办法避免这种情况并获得我想要的独特功能(请不要建议使用部分)。

def lin_fun(x, a, b):
    return a*x + b

funs = {}
params = [(1,2), (3,4)]

for param in params:
    funs[param] = lambda x: lin_fun(x, *param)
    
print(funs[params[0]](100))
# prints 304
print(funs[params[1]](100))
# prints 304

【问题讨论】:

    标签: python


    【解决方案1】:

    因为循环中名称绑定的工作原理。

    您还需要一个堆栈帧才能正确捕获值:

    
    def bind(f, *params):
        return lambda x: f(x, *params)
    
    for param in params:
        funs[param] = bind(lin_fun, *param) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-30
      • 2016-04-17
      • 2023-02-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 2023-03-22
      • 2015-10-10
      相关资源
      最近更新 更多