为什么这两个“x”引用不同的变量?

2023-12-08

在此代码中,lambda 中的 x 引用 for 语句中的 x。所以y[0]()返回 2:

x = 0
y = [lambda : x for x in range(3)]
y[0]()

但在这段代码中,lambda 中的 x 指的是全局 x,所以x[0]()返回全局 x 本身:

x = [lambda : x for x in range(3)]
x[0]()

我想知道为什么 lambda 中的 x 指的是第一段代码中的本地 x,但第二段代码中的 x 指的是全局 x。


我猜你使用的是 python 2.x,在列表理解中,临时变量“泄漏”到命名空间中。您可以阅读其中的原因Guido 的这篇博文.

在 Python 2 中,列表推导式“泄漏”了循环控制变量 进入到了周围的范围……这是原本的神器 列表理解的实现;它是 Python 的“脏”之一 小秘密”多年来。

这已在 python 3 中修复。

我不知道你为什么把事情与lambda,在这里您将在这个更简单的情况下看到相同的行为:

>>> x = 'a'
>>> y = [x for x in 'b','c']
>>> x
'c'
>>> x = [x for x in 'b','c']
>>> x
['b', 'c']
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这两个“x”引用不同的变量? 的相关文章

随机推荐

  • 使用 LINQ 解析 Amazon Marketplace XML

    我有一系列来自 Amazon 的复杂 XML 文件 显示订单报告 XML 片段如下
  • Pandas 数学运算,以列值为条件

    我需要进行一个数学运算 该运算以第二列中的值为条件 这是设置 给定一个简单的数据框 df df pd DataFrame col1 A A B np nan D C col2 2 1 9 8 7 4 col3 0 1 9 4 2 3 In
  • 简单的JQuery嵌套列表遍历问题

    我有一个问题 我确信它非常简单 但我花了几个小时试图让它工作但无济于事 我试图在单击父列表项时显示嵌套列表 这是 JQuery 这是 HTML div ul li a href Database a li ul li a href view
  • 使用 case 语句创建触发器

    我有这两个表 USERS username role id COMMISSION RATES username commission rate users username是主键 commission rates username是外键 我
  • 使用 OpenCV 处理轮廓时错误:(-215:断言失败)npoints > 0

    当我运行这段代码时 import cv2 image cv2 imread screenshoot10 jpg cv2 imshow input image image gray cv2 cvtColor image cv2 COLOR B
  • 如何使用 Bootstrap 轮播显示上一张和下一张图像

    我正在寻找的效果如下图所示 它是一个包含 3 张图像的轮播 如何使 bootstrap 轮播显示不透明度为 0 7 的左右图像 以下是我的轮播模板 div class col md 10 center block img src img y
  • 如何通过测试正确设置和拆卸我的 pytest 类?

    我正在使用 selenium 进行端到端测试 但我不知道如何使用setup class and teardown class方法 我需要设置浏览器setup class方法 然后执行一系列定义为类方法的测试 最后退出浏览器teardown
  • Xpages 脱离服务器端缓存

    这个问题可能与非常具体的 Domino 版本有关 见下文 因此我从一些技术细节开始 有问题的服务器是虚拟化的 Windows 2008 R2 64 位计算机 多米诺骨牌发布是 IBM Domino r 服务器 64 位 适用于 Window
  • python 在 true 时重复程序 [重复]

    这个问题在这里已经有答案了 我试图让我的程序在用户输入 y n 时重复 但是我对如何在这种类型的输入中使用 while true 感到困惑 下面是一些代码 again input Would you like to play again e
  • 错误 C2664 和 E0167,难倒了

    我正在参加 C 初学者的远程课程 但无法解决此编译错误 它的编写方式与示例书中完全相同 当我兄弟将其剪切并粘贴到他的 VS2015 中时 它工作正常 但在我的 VS2017 中却不行 我已经卸载并重新安装VS2017社区无济于事 我只编码了
  • ExtJs 4 - 在记录保存时加载嵌套数据

    我有两个模型 掌握 Ext define App model Master extend Ext data Model fields name master name type string name id type int proxy t
  • 如何将 IO monad 中的值分配给 RankNType 限定的构造函数

    更新 我使用了一个界面自由单子到通用数据存储 我想将用户在运行时选择的特定解释器 DataStore a gt IO a 与一些其他信息一起放入状态单子中 我似乎无法将任何内容放入数据结构的该字段中 如何将值放入定义为更高级别类型的字段中
  • .NET 4.0 在如何正确调用 WCF 服务中有何变化?

    我正在寻求一些建议 如果之前有人问过这个问题 我很抱歉 当我调用 WCF 服务时 我使用以下模式 我早在早期的 WCF 版本 VS2008 中 就开发了这种模式 现在很好奇在当前版本的 WCF VS2010 中 中是否仍然需要此 Close
  • 线程中保存核心数据,如何保证线程退出前写入完毕?

    所以我将小图像保存到核心数据中 这需要really保存时间很短 比如 0 2 秒 但我是在用户翻阅滚动视图时执行此操作的 因此为了提高响应能力 我将保存移动到线程中 这效果很好 一切都被保存并且应用程序响应迅速 然而 核心数据 多线程文档中
  • 错误:右边框上的布局边界必须从边缘开始

    我的项目昨天运行良好 但是当我今天将 Android studio 更新到 3 0 时 默认情况下会启用 AAPT2 我有以下错误 Error layout bounds on right border must start at edge
  • 温莎城堡:使用内部构造函数注册类?

    温莎城堡问题 是否可以向容器注册一个具有内部构造函数的类 谢谢 乔尼 对的 这是可能的 默认组件激活器仅查找公共构造函数 您可以为该组件提供自定义组件激活器 将内部构造函数考虑在内 或者使用例如工厂来激活组件 var container n
  • iOS 7:旋转 UICollectionView 后将显示的项目保留在查看区域中

    我正在使用一个UICollectionView水平滚动 布局 UICollectionViewFlowLayout 旋转后 我调整内容偏移量 以便在旋转之前显示相同的项目 旋转时 项目的宽度会发生变化 因为屏幕上始终有七个项目 我当前的方法
  • 使用 Powershell 实现 IE 自动化

    我正在尝试使用 Powershell 和 IE 自动登录我们的 Intranet 网站 到目前为止 我有以下有效的代码 ie new object com InternetExplorer Application ie navigate h
  • 在非 NixOS 系统上使用“nix”安装 Elixir 或 Erlang > 19 的规范方法是什么?

    请像向 10 岁孩子解释一样 从 Nix 包管理器安装在非 NixOS 计算机上之后开始 例如 我在 Mac 上 甚至没有 config目录 我找到了以下 可能 相关资源 但我无法将这些资源放在一起 Nixpkgs 手册 9 1 BEAM
  • 为什么这两个“x”引用不同的变量?

    在此代码中 lambda 中的 x 引用 for 语句中的 x 所以y 0 返回 2 x 0 y lambda x for x in range 3 y 0 但在这段代码中 lambda 中的 x 指的是全局 x 所以x 0 返回全局 x