首页 > 解决方案 > 避免对象指向同一个底层对象

问题描述

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

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

解决方案


因为循环中的名称绑定是如何工作的。

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


def bind(f, *params):
    return lambda x: f(x, *params)

for param in params:
    funs[param] = bind(lin_fun, *param) 

推荐阅读