gpt4 book ai didi

python - python 中奇怪的关闭行为

转载 作者:太空狗 更新时间:2023-10-29 17:25:37 26 4
gpt4 key购买 nike

我有一个简单的代码:

def get():
return [lambda: i for i in [1, 2, 3]]

for f in get():
print(f())

根据我的 python 知识,输出为 3 - 整个列表将包含 i 的最后一个值。但这在内部如何运作?

AFAIK,python 变量只是对对象的引用,所以第一个闭包必须首先包含对象 i 引用 - 这个对象肯定是 1,而不是 3 O_O。 python闭包怎么会包含变量本身而不是对象这个变量引用?它会将变量名称保存为纯文本、一些“对变量的引用”还是什么?

最佳答案

正如@thg435 指出的那样,lambda 不会在那一刻封装值,而是封装范围。解决这个问题的方法太少了:

lambda 默认参数“hack”

[ lambda v=i: v for i in [ 1, 2, 3 ] ]

或者使用 functools.partial

from functools import partial
[ partial(lambda v: v, i) for i in [ 1, 2, 3 ] ]

本质上,您必须将作用域移动到您正在创建的函数的本地。通常,我更喜欢使用 partial,因为您可以将可调用对象传递给它,并且可以将任何 args 和 kargs 传递给它以创建具有适当闭包的可调用对象。在内部,它包装了您的原始可调用对象,以便为您转移作用域。

关于python - python 中奇怪的关闭行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11109838/

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