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

python中的奇怪的关闭行为

麻鸿熙
2023-03-14
问题内容

我有以下简单代码:

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闭包如何将变量本身而不是对象作为变量引用的对象?它是否将变量名另存为纯文本,一些“对变量的引用”或什么?


问题答案:

闭包不是指 变量 ,而是 范围
。由于i范围内的最后一个值为‘3’,因此所有三个闭包均返回相同的值。要“锁定”变量的当前值,只需为其创建一个新的作用域:

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


 类似资料:
  • 问题内容: 我不了解python中列表的行为: 为什么一个元素的分配影响另一个元素?感谢您的回答! 问题答案: 当您将一个列表相乘时,它会复制对该列表的引用,但不会创建该列表的副本。由于列表是可变的,因此在更改列表时,所有对其引用的引用都会更改。 用ASCII术语来说: 您可以清楚地看到更改list3将同时影响两个位置。 如果要创建可变长列表而不复制引用,则应执行以下操作: 在这里,我们使用列表理

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 我在http://www.nodebeginner.org上读了一篇教程,我在数据输出中有一个奇怪的行为。我知道,Stackoverflow也有类似的问题,但没有答案。所以我有这个Web-Server的代码: 调用RequestHandler.Upload的Router.js代码-我的buggy函数 和RequestHandler.Upload的代码 假设POST数据中有一个字符串。该函数的第一行

  • 我很难理解Istio网关端口到底是如何使用的。我指的是下面例子中的第14行 从Istio文档中: 代理应在其上侦听传入连接的端口。因此,如果您应用上面的yaml文件并检查istio-ingress网关pod以监听TCP端口,您会发现实际上使用了端口8169(见下面的输出) 但棘手的部分来了。如果在应用Gateway之前更改istio-ingress网关服务如下: 然后应用网关,实际使用的端口不是8

  • 我在网豆里有某种奇怪的行为。我想我不小心输入了一些键组合,弄乱了光标和选择行为。在图像中,您将看到我的意思:通常,如果您跨多行选择文本,您将在右侧屏幕截图中看到行为。 但是我有左边截图上的行为。此外,尝试使用Shift在某个位置插入文本,将其插入到右侧的某些位置(=不是光标所在的位置)。此外,当光标闪烁时,它显示为虚线。 左侧屏幕截图中的选择画得很好,这一事实并没有让我想到一个bug,而是一个特性