当前位置: 首页 > 面试题库 >

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

段干博明
2023-03-14
问题内容

为什么使用lambda函数来获取值列表i = 4。在调用lambda期间,不存在封闭范围。函数f已经完成工作并返回了控制(变量i不存在)。

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



def f1(N):
    def f2(X):
        return X**N
    return f2
f=f1(2) 
f (3)  
 9
g = f1(3)
g(3)
27
f(3)
9

问题答案:

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_contents
4

这也是列表中 所有 lambda L引用value4而不是0到4的原因。它们都引用 相同的 闭包:

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

闭包引用 变量
,而不是定义闭包时该变量的值。循环的i最后一次设置为4,因此在查找时,对于列表中的所有lambda,都会找到ilambda闭包4

如果您希望lambdai在循环期间引用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 ** x

def 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

闭包引用特定命名空间中的变量;每次您调用函数时,都会创建一个新的本地名称空间,因此每个闭包都icreate_lambda与的其他调用不同的单独名称空间中引用create_lambda



 类似资料:
  • 问题内容: 我有以下代码: 我的索引超出范围错误,我不知道为什么。我声明了大小为10的尺寸。为什么会出现此错误? 问题答案: 您声明了一个,其初始容量为10个元素,但没有向此列表中添加元素,即列表为空。将替换现有元素,但是由于列表中没有元素,因此将引发异常。您必须使用方法在之前添加元素。 表示列表内部维护的数组的开头大小为10。在列表中添加更多元素时,此内部数组的大小可能会更改。

  • 问题内容: 我收到错误 BIGINT UNSIGNED值超出范围在’(1301980250 - 。。 )’ 当我运行查询 删除ORDER BY条件,也将删除错误。我该如何解决? 更新: 日期字段包含UNIX时间戳(例如:1298944082)。我将MySQL从5.0.x升级到5.5.x后开始出现错误 有什么帮助吗? 问题答案: 我最近遇到了这个问题,并找到了最合理的解决方案,可以将任何UNSIGN

  • 问题内容: 为什么花括号没有在Java中定义单独的本地范围?我期望这是主要花括号语言(C,C ++,Java,C#)所共有的功能。 问题答案: 它们确实定义了单独的局部作用域,但是您仍然不能从父作用域中屏蔽局部变量(但是您当然可以屏蔽实例变量)。 但是您可以定义新变量(使用不同的名称),并且它们的范围将限于括号内。

  • 问题内容: 我有一列设置为尝试插入诸如的数字时,它表示超出范围。为什么? 问题答案: 在 MySQL中,An 存储在4个字节上,因此只能包含和之间的值。 大于; 因此它不适合-看起来您将不得不使用 。 有关此信息,请参见MySQL手册的“ 数据类型- 数值类型” 部分 。

  • 我在设置鹰派代理时遇到问题。我已经在 OpenShift 容器中设置了代理,当代理尝试调用在另一个容器中运行的另一个应用程序的 jolokia endpoint时,我收到此错误日志: 也许有人有类似的问题?代理的版本是Hawkular OpenShift Agent:版本:0.1.0。

  • 问题内容: 因此,我正在编写一个简单的程序来输入字符串并计算总数。的米 所以,这是我的代码 where 和str是我接受过的字符串,但是此错误不断出现 这是什么错误以及如何将其删除? 问题答案: 字符串,有效索引从0到n-1; 更改 至