python - 避免对象指向同一个底层对象
问题描述
有人可以解释为什么在以下示例中所有功能在运行后都相同吗?有没有办法避免这种情况并获得我想要的独特功能(请不要建议使用部分功能)。
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
解决方案
因为循环中的名称绑定是如何工作的。
您还需要一个堆栈帧才能正确捕获值:
def bind(f, *params):
return lambda x: f(x, *params)
for param in params:
funs[param] = bind(lin_fun, *param)
推荐阅读
- azure - Azure 自动化运行 Sharepoint Online PowerShell Set-Commands
- javascript - 如何访问 bundle.js 中的变量/函数
- git - 是否可以创建一个孤立分支并仅为最后一个分支设置一个新的远程存储库?
- c# - 实体框架 SqlQuery:如何实现 .where .orderby 扩展并包含导航属性?
- python - 带有值的堆积条形图
- android - Xamarin Forms App 在华为 P20 Pro 上崩溃
- django - Sentry DjangoIntegration event_level
- mysql - 在子查询中使用 in 参数?
- java - 为什么每次执行或进入 #3 菜单时我的 #3 菜单都没有显示
- html - 在 phpStorm 中定义 (X)HTML 节点代码内容