在全局命名空间中查找类定义中未绑定的局部变量 - 这意味着什么?

2023-12-30

最后一段https://docs.python.org/3/reference/executionmodel.html#resolution-of-names https://docs.python.org/3/reference/executionmodel.html#resolution-of-names says

类定义块以及 exec() 和 eval() 的参数在名称解析上下文中是特殊的。类定义是可以使用和定义名称的可执行语句。这些引用遵循名称解析的正常规则,但在全局命名空间中查找未绑定的局部变量除外。

引用文本的最后一句是什么意思?起初我从中推断出以下代码将打印1

a = 1

def foo():
    a = 2
    def bar():
        class Bar:
            b = a
        print(Bar.b)
    bar()

foo()

但我错了 - 由上面的代码组成的模块在运行时会打印2,即名称a在类定义中,即使它没有绑定在类定义块中,也没有绑定在其外部的本地块中,也不会在全局命名空间中查找,这与文档所说的相反。

我尝试了下面描述的另一个代码片段(使用del语句,这是一个绑定其中变量的构造)

a = 1

def foo():
    a = 2
    def bar():
        class Bar:
            del a
        print(Bar.b)
    bar()

foo()

but the del声明提出NameError: name 'a' is not defined.

所以我不明白,这句话是什么意思?


根据文档 https://docs.python.org/3/reference/executionmodel.html#binding-of-names,

如果名称绑定在块中,则它是该块的局部变量,除非声明为非局部或全局变量。

在你的第一个代码块中,a不绑定到你的任何东西class Bar定义,因此它不是该块的局部变量。

绑定名称的一种方法是在赋值语句的左侧使用它。这是一个例子。

a = 1
def foo():
    a = 2
    class Bar:
        b = a
        a = 3
    print(Bar.b)
foo()

Result:

1

这演示了“在全局命名空间中查找未绑定的局部变量”的原理——b = a使用全局的值a而不是其价值a本地到foo.


在你的第二个例子中,a is被认为是本地的class Bar块,因为为了确定名称的范围,“del 语句中出现的目标也被视为绑定”。但是“在全局命名空间中查找未绑定的局部变量”是不相关的,因为del不需要查找名称的值来解除绑定。

为了更好地衡量,我们可以通过实验证实del语句向解释器发出信号,表明名称应被视为本地名称。

a = 1
def foo():
    a = 2
    class Bar:
        print(a)
        del a
foo()

Result:

1
Traceback (most recent call last):
  File "C:\Users\Kevin\Desktop\test.py", line 7, in <module>
    foo()
  File "C:\Users\Kevin\Desktop\test.py", line 4, in foo
    class Bar:
  File "C:\Users\Kevin\Desktop\test.py", line 6, in Bar
    del a
NameError: name 'a' is not defined

在这里我们看到print(a)成功查找局部变量的值a,然后在下一行它崩溃了,因为del无法删除未绑定的局部变量。

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

在全局命名空间中查找类定义中未绑定的局部变量 - 这意味着什么? 的相关文章

随机推荐

  • Facebook JavaScript SDK:FB.ui 打开一个弹出窗口

    我试图在 facebook iframe 应用程序中使用以下代码显示 发布到您的墙 提要对话框 div div
  • 增加 parallel.foreach 范围之外的计数值

    如何增加parallel foreach 循环范围之外的整数值 同步对并行循环之外的对象的访问的最简单方法是什么 var count 0 Parallel ForEach collection item gt action item inc
  • 在 Xcode 中查找方法引用

    Xcode 中有没有办法找到调用方法或属性的所有位置 例如 在 Eclipse 中 您可以右键单击一个方法并选择查找参考资料 Xcode中有类似的东西吗 选择您感兴趣的方法 或将文本光标置于其中 通过编辑器左上角的图标打开 相关文件 菜单
  • 使用链表压栈操作失败

    我正在尝试使用单个链表创建堆栈 我的推送操作不会将数据插入链表 这是我到目前为止所尝试过的 typedef struct element int data struct element next node 推送方法 void push no
  • 在欧几里得空间中嵌入图

    我有一个总无向图 其中节点表示平面上点上的点 边是点之间的近似欧几里德距离 我想将此图 嵌入 到二维空间中 也就是说 我想将每个顶点转换为 x y 位置元组 以便对于任意两个两个顶点 v 和 w 边 v w 的权重接近 dist v w 例
  • 如何保持指针之间的 const 正确性?

    我试图对一个真正 const 的类进行 const 操作 它不会更改该类指向的数据 例如 class Node public int val class V public Node node what is the change that
  • 如何让 doSMP 与 plyr 完美配合?

    这段代码的工作原理 library plyr x lt data frame V c X Y X Y Z Z 1 5 ddply x V function df sum df Z parallel FALSE 虽然此代码失败 library
  • 两个坐标系之间的3D变换矩阵matlab

    我有一个坐标系A 示例 系统A的3个主向量方向为 e0 0 3898 0 0910 0 9164 e1 0 6392 0 7431 0 1981 e2 0 6629 0 6630 0 3478 并且 我有一个具有三个单位向量的笛卡尔坐标系
  • 带有段落的 Div,段落编号对齐并位于 div 外部(参见草图)

    我需要在 CSS 中执行此操作 红色框是一个 div 有几个段落 p 我想要将段落编号放在红色框的右侧 并且段落编号与相应的顶部对齐 p p 我可以只使用 CSS 来实现此布局吗 到目前为止 我已经尝试使用 javascript 来做到这一
  • Sublime Text 2如何设置环境变量

    我想设置环境变量 说的是https docs sublimetext io guide extensibility snippets html https docs sublimetext io guide extensibility sn
  • 无法使用 meld 进行 svn diff

    我想使用 meld 来查看修订版之间的差异 我安装了meld 然后在项目目录下执行 svn diff r 2165 2182 diff cmd meld 但它会引发以下错误 Index app models college friends
  • Python 的配置文件模块: :1(?)

    我正在使用Python v2 4 profile分析模块numpy脚本 以下条目似乎占据了大部分执行时间 ncalls tottime percall cumtime percall filename lineno function 256
  • 使用replaceData函数替换R格式数据表中的数据

    我需要顺利替换 格式表 数据表中的数据 而重新加载时页面不会闪烁 按照 yihui 的示例 https github com rstudio DT issues 168 https github com rstudio DT issues
  • PHP 流媒体 MP3

    我和提问者的情况很相似 我可以使用 PHP 提供 MP3 文件吗 https stackoverflow com questions 1516661 can i serve mp3 files with php基本上我试图保护 mp3 文件
  • 如何在 ASP.NET 5 中启用静态文件的浏览器链接

    有没有办法让浏览器链接在 ASP NET 5 下处理静态文件 我的 Startup cs 目前有以下内容 public void Configure IApplicationBuilder app app UseBrowserLink ap
  • 使用 MongoDB 全文搜索进行排序

    我正在寻找一种在使用 mongodb 2 4 执行全文搜索时按字段值对结果进行排序的方法 我的文本搜索命令如下所示 db books runCommand text search science 我想做的是这样的 db books runC
  • 如何在java中组合两个不同的Map?

    我关注了很多这样的链接合并两个地图 https stackoverflow com questions 8795945 merging two maps 但还无法解决问题 我有两张地图List
  • 在 Windows 10 上找不到 docker-machine 命令

    我最近在 Windows 10 中使用 git bash 通过以下网址安装了 docker 机器 https github com docker machine releases tag v0 16 2 https github com d
  • Perl Web 框架之间有性能比较吗?

    我曾看到有人提到 Embperl 是最快的 Perl Web 框架 听起来像是未经证实的观点 而且已经过时了 我想知道是否对主要稳定 Perl Web 框架的相对速度达成共识 或者理想情况下 在相同示例 Web 应用程序或单个功能 例如会话
  • 在全局命名空间中查找类定义中未绑定的局部变量 - 这意味着什么?

    最后一段https docs python org 3 reference executionmodel html resolution of names https docs python org 3 reference executio