使用列表理解来查找变量适用于 globals(),但不适用于 locals()。为什么? [复制]

2023-11-26

我正在将项目从 python 2.7 更新到 python 3.6。

我有一个列表理解,可以从在 python 2.7 中工作的局部变量中查找变量。当我切换到使用全局变量时,它仅适用于 python 3.6。

下面是一个玩具示例来说明这个问题。

相关代码是:

(A,B,C) = (1,2,3)
myvars = ['A','B','C']

如果我执行以下代码:

[locals().get(var) for var in myvars]

python 3.6 中的返回值为:

[None, None, None]

然而,python 2.7中的返回值是:

[1, 2, 3]

如果我使用全局变量执行以下代码:

[globals().get(var) for var in myvars]

然后我在 python 2.7 和 3.6 中得到相同的结果:

[1, 2, 3]

谁能解释为什么使用 locals() 的代码在 python 3.6 中不再有效?


如果我们分解一个更基本的列表理解。我们可以看到为什么会发生这种情况:

>>> import dis
>>> dis.dis("[i for i in range(10)]")
  1           0 LOAD_CONST               0 (<code object <listcomp>)
              3 LOAD_CONST               1 ('<listcomp>')
              6 MAKE_FUNCTION            0
              9 LOAD_NAME                0 (range)
             12 LOAD_CONST               2 (10)
             15 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             18 GET_ITER
             19 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             22 RETURN_VALUE

那么,上线9,我们看到 list-comp 实际上创建了一个被调用的函数(在使用生成器时您可能更习惯于此)。因此,该函数将有自己的一组局部变量,因为它位于单独的作用域中 - 从而产生这种意外的行为。


此外,正如指出的@juanpa, “Python3 的新增功能”文档请明确说明以下内容:

列表推导式具有不同的语义:它们更接近于生成器表达式中的语法糖list()构造函数,特别是循环控制变量不再泄漏到周围的作用域中。


另请注意,这里有一个错误页面:https://bugs.python.org/issue21161,但是 juanpa 使我相信这不是一个错误,因为它被明确记录为以这种方式工作!

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

使用列表理解来查找变量适用于 globals(),但不适用于 locals()。为什么? [复制] 的相关文章

随机推荐

  • Go 中的垃圾收集和指针的正确使用

    我有 Python Ruby JavaScript 背景 我了解指针的工作原理 但是 我不完全确定如何在以下情况下利用它们 假设我们有一个虚构的 Web API 它会搜索某个图像数据库并返回一个 JSON 描述找到的每个图像中显示的内容 u
  • CPU缓存如何影响C程序的性能

    我试图更多地了解 CPU 缓存如何影响性能 作为一个简单的测试 我将矩阵第一列的值与不同数量的总列数相加 compiled with gcc Wall Wextra Ofast march native cache c tested wit
  • 扩展 jQuery 的 .on() 以处理移动触摸事件

    我正在尝试使用 jQuery mobile 事件 而不使用 jQuery mobile 的其余部分 https github com jvduf jquery mobile events blob master jquery mobile
  • 如何透明地重定向 Python 导入?

    我正在寻找一种模拟 Python 导入符号链接的方法 我希望能够就地解压以下文件夹结构而无需复制文件 root python lib my utils init py etc py app1 app2 app3 lib init py my
  • 当没有 PYTHONPATH 时,PYTHONPATH 是什么?

    我需要向我的目录添加一个新的目录位置PYTHONPATH 但问题是我在一个干净的 新安装的系统 Linux 上 没有PYTHONPATH尚未被定义 我读过并使用过PYTHONPATH我以为我很理解它 但我不知道当没有时会发生什么PYTHON
  • 导入 Google API 字体不适用于 github 页面

    我主持了一个主题GitHub 页面 这个主题在localhost环境 但是当我托管它时 它没有应用从 Google API 导入的正确字体 区别在这里 本地主机版本 Github页面版本 这是我的Index html page
  • 如何在Android中设计任何屏幕尺寸和密度(Android手机的多屏幕)

    如何在不使用值文件夹中的维度的情况下处理 Android 手机的多屏幕设计 我的应用程序支持所有 Android 手机 我在设计上遇到了问题 因为我在值文件夹中使用 dimen 来处理它 所以请任何人都可以帮助我在不使用维度的情况下解决这个
  • stdcall 和 cdecl

    有 除其他外 两种类型的调用约定 stdcall and cdecl 我对他们有几个问题 当cdecl函数被调用时 调用者如何 知道是否应该释放堆栈 在呼叫站点 是否 调用者知道被调用的函数是 cdecl 还是 stdcall 功能 它是如
  • 计算没有 getSpeed() 方法的导航应用程序的速度

    我正在开发一个应用程序 它更像是朋友之间的时移竞赛 我需要计算移动车辆的速度 但我不想使用Location getSpeed 方法 底部详细解释了为什么我不想使用它 我正在尝试借助可用的纬度和经度来计算速度 这就是我需要帮助的地方 需要的帮
  • JPQL IN 子句:Java 数组(或列表、集合...)?

    我想加载所有将文本标记设置为数据库中任意少量但任意数量的值的对象 在 SQL 中解决此问题的逻辑方法是构建一个 IN 子句 JPQL 允许 IN 但它似乎要求我直接指定 IN 的每个参数 如 in in1 in2 in3 是否有某种方法可以
  • Django - 简单的自定义模板标签示例

    I have users videos topics 标准 and ratings A video has a topic A topic has 标准 A user可以创建一个video对于给定的topic A user可以评价一个vid
  • jQuery 验证器:验证字母数字+空格和破折号

    我的网站上安装了 jQuery 验证插件 http docs jquery com Plugins Validation 我正在使用此代码来验证文本字段中的字母数字 并且它有效 但它不允许空格和破折号 validator addMethod
  • 所有开发者都拥有一把 Google 地图钥匙?

    我们在应用程序中使用 Google MapView 但在不同的计算机上我们必须使用不同的 API 密钥 否则 MapView 不会显示任何内容 有没有办法为所有开发者设置一把钥匙 有没有办法为所有开发者设置一把钥匙 对于调试签名密钥 请复制
  • JavaFX 8 如何设置程序图标来提醒?

    如何在不使用的情况下将程序图标设置为警报alert initOwner 为什么没有initOwner 这是因为在初始化整个窗口之前必须显示一些警报 所以没有可以放置的场景initOwner功能 你可以窃取对话框面板来自 Alert 实例 并
  • 在 PowerShell 中使用变量将多个参数传递给外部程序

    我下载了用于合并 junit 报告的 npm 包 https www npmjs com package junit merge 问题是我有多个文件要合并 我正在尝试使用字符串变量来保存要合并的文件名 当我自己编写脚本时 如下所示 juni
  • 如何将“预邮件程序”与 Rails 集成

    如何将 预邮者 gem 与 Rails 3 0 7 项目 我的邮件中目前有 def welcome user user user mail to user email subject Welcome end 但我不知道如何集成该库 我需要打
  • TFS 2010:如何使用标签在应用程序的两个版本之间生成更改日志(即工作项列表)?

    我正在寻找一种在应用程序的两个版本之间自动生成变更日志 实际上是工作项列表 的方法 我的应用程序有两个版本 v1 和 v2 每个版本都由我在构建应用程序设置之前手动创建的 TFS 2010 中的标签 LABEL1 和 LABEL2 进行标识
  • 是什么设置了“auto_saved_sql”键以及为什么?在本地存储下的chrome devtools中找到

    我在 Chrome 中检查我的网络应用程序 发现一个名为 auto saved sql 的键包含以下查询语句 SELECT FROM myTable WHERE 我在控制台 gt 应用程序 gt 本地存储下找到了它 我的应用程序仍在开发中
  • SonataAdmin:替换面包屑中的 ID

    如何用其他文本替换 Sonata Admin 面包屑中的对象 ID 如果我设置 toString 在我的文档中 它仅适用于编辑 当我尝试创建新记录时 出现类似的情况MyDocument 0000000000e09f5c000000006a4
  • 使用列表理解来查找变量适用于 globals(),但不适用于 locals()。为什么? [复制]

    这个问题在这里已经有答案了 我正在将项目从 python 2 7 更新到 python 3 6 我有一个列表理解 可以从在 python 2 7 中工作的局部变量中查找变量 当我切换到使用全局变量时 它仅适用于 python 3 6 下面是