gpt4 book ai didi

python - 带有 lambda 函数字典的 python 中的奇怪行为

转载 作者:行者123 更新时间:2023-11-28 17:30:41 26 4
gpt4 key购买 nike

我已经编写了一个用于生成 lambda 常量函数字典的函数(它是更复杂函数的一部分,但我已将其简化为以下代码):

def function(a):
_interpolators = {}
for key in a.keys():
_interpolators[key] = lambda t: a[key]

def _interpolate(t):
return {key:f(t) for (key,f) in _interpolators.items()}
return _interpolate

if __name__ == '__main__':
d = {"foo": 2, "bar":4}
f = function(d)
print(f(0)["bar"])

在 OSX El Capitan 上使用 Python 3.5.1,程序的输出是随机的。它可以是 24 而我希望只有 4。我不太理解这种行为。

请注意,python 2.7.10 似乎没有出现“错误”,当我多次运行该程序时,我总是得到 4

它是 python 3.5.1 中的某种错误还是我错过了一些明显的东西?

最佳答案

重点是在您定义如下的 lambda 函数中:

lambda t: a[key]

您没有使用变量 t 并试图通过将变量 key 作为您的键传递来获取 a 的值字典。下次您尝试在字典理解中包含函数时使用此函数:

{key:f(t) for (key,f) in _interpolators.items()}

每次你尝试获取f(t)时,由于t的存在在这里是多余的python尝试获取a 的值是通过传递变量 key 给它的,它与 t 无关。

最重要的一点是,您希望 python 覆盖 key 变量,因为您在字典理解中使用 key

并且因为 lamda 对象是 python 中的一个函数并且有自己的本地命名空间,每次它试图返回 a[key] 时它都无法访问迭代理解中的变量 key 所以由于 LEGB 方式,它 (lambda) 在 Local 命名空间中查找 key 然后封闭并没有找到任何东西,它在全局范围内查找它。

并且由于全局 key 是以下部分中的最后一个迭代变量:

for key in a.keys():
_interpolators[key] = lambda t: a[key]

lambda 函数会将其用作。由于在 python 3.X 中 dict.keys() 的顺序是随机的,因此结果也是随机的。虽然在 python 2 中不是这样。

为了解决这个问题,您只需按如下方式更改 lambda:

lambda t: a[t]

在你的代码中:

def function(a):
_interpolators = {}
for key in a.keys():
_interpolators[key] = lambda t: a[t]

def _interpolate():
return {k:f(k) for k,f in _interpolators.items()}
return _interpolate

if __name__ == '__main__':
d = {"foo": 2, "bar":4}
f = function(d)
print(f()["bar"])

关于python - 带有 lambda 函数字典的 python 中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34554717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com