python - 为什么在全局范围内消息是“名称未定义”而不是“分配前引用的变量”?
问题描述
一个无法访问的赋值语句在本地范围内创建了一个“已定义但未分配”的名称,但这不适用于全局范围:
#!/usr/bin/python3
#global scope
if False:
baz = 4
pass
#Raise "NameError: name 'baz' is not defined"
print(baz)
我希望variable 'baz' referenced before assignment
在全局范围内得到类似于在本地范围内的消息,但实际消息name 'baz' is not defined
在全局范围内。
我在 Python 3.7.2+ 中运行。
解决方案
在函数作用域中,Python 分析所有赋值操作以生成作用域应具有的变量的完整列表。局部变量查找在字节码编译时已知对应于函数主体中对该变量的至少一个实际赋值,因此未绑定局部变量的异常消息提到了赋值。
没有这样的分析发生在全局或类范围内,也没有这样的分析可能是全面的,因为from whatever import *
在globals().update(stuff)
编译时绑定了未知的变量。Python 不会尝试跟踪全局范围“应该”具有哪些变量,也不会尝试区分
print(a)
a = 1
在绑定之前使用变量的位置,以及
print(b)
根本没有绑定操作,或者
thing = 1
print(thinh)
哪里thinh
有错字。无论是否有分配,都使用相同的错误消息模板,因此当可能根本没有分配时,模板说“分配前”没有多大意义。
推荐阅读
- python - 无法将文件作为模块加载
- powershell - 我需要我的脚本在 -Whatif 输出中包含“LastWriteTime”属性
- selenium - findElements 调用返回的 chromedriver 错误“未找到陈旧的元素”
- c# - C# ASP.NET MVC 显示属性(通过 Resources.resx 提示)文件
- azure - 是否可以在 Azure 警报中显示 KQL 查询结果?
- flutter - setState 更新 ui 后,如何在 SingleChildScrollView 中保持小部件的位置
- c++ - C++ 类变量在赋值后不会改变
- c# - 如何编译一个可以在按住同一个键时重复击键的程序?
- java - 为什么 Java Scanner 会抛出 NoSuchElementException,除非我通过 Path 而不是 File 声明我的 Scanner?
- selenium - WebDriverException:消息:进程意外关闭状态信号| 如何在 Google Colaboratory 中运行 Selenium Firefox Geckodriver?