栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

本地范围,超出了封闭范围

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

本地范围,超出了封闭范围

Python使用闭包捕获对原始变量的引用。这些

lambda
对象保留对
i
名称的引用,可以通过该引用访问值。这意味着
i
变量在
f
完成后将继续存在。

您可以

.__closure__
在lambda对象的元组中内省此闭包;函数具有相同的属性:

>>> L[0].__closure__(<cell at 0x1077f8b78: int object at 0x107465880>,)>>> L[0].__closure__[0]<cell at 0x1077f8b78: int object at 0x107465880>>>> L[0].__closure__[0].cell_contents4

这也是列表中 所有 lambda

L
引用value
4
而不是0到4的原因。它们都引用 相同的 闭包:

>>> L[0].__closure__[0] is L[1].__closure__[0]True

闭包引用 变量
,而不是定义闭包时该变量的值。循环的

i
最后一次设置为
4
,因此在查找时,对于列表中的所有lambda,都会找到
i
lambda闭包
4

如果您希望lambda

i
在循环期间引用value,请在关键字参数中捕获它:

def f():    L = []    for i in range(5):         L.append(lambda x, i=i: i ** x)     return L

现在

i
是lambda的局部变量,而不是闭包。

或者,创建一个全新的范围来从中绘制闭合:

def create_lambda(i):    return lambda x: i ** xdef f():    return [create_lambda(i) for i in range(5)]

现在

create_lambda()
是一个新的作用域,它具有自己的本地
i
供lambda闭包引用。然后,每个lambda都有自己的闭包:

>>> L[0].__closure__[0] is L[1].__closure__[0]False

闭包引用特定命名空间中的变量;每次您调用函数时,都会创建一个新的本地名称空间,因此每个闭包都

i
create_lambda
与的其他调用不同的单独名称空间中引用
create_lambda



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/624529.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号