我有以下简单的代码:

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

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

正如我对python的了解所预期的那样,输出为3-整个列表将包含最后一个值i。但这在内部是如何工作的呢?
afaik,python变量只是对对象的引用,所以第一个闭包必须首先包含对象ireference-而这个对象绝对是1,而不是3 o_o。python闭包是如何将变量本身而不是对象这个变量引用包含进来的?它是否将变量名保存为纯文本、某些“变量引用”或什么?

最佳答案

闭包不引用变量,而是引用范围。由于其作用域中的最后一个值i是“3”,所有三个闭包都返回相同的值。要“锁定”变量的当前值,请为其创建一个新范围:

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

07-24 09:50
查看更多