python - NameError 在理解中引用类变量
问题描述
当我NameError: name 'ID' is not defined
试图在字典理解中访问类变量时,例如在class A
. 在没有理解的情况下引用它可以正常工作(请参阅 参考资料class B
)。所以我的问题是,为什么它会在 A 类中抛出 NameError 而在 B 类中却没有?
class A:
ID = "This is class A."
test = {str(i): ID for i in range(5)}
class B:
ID = "This is class B."
test = f"{ID}"
解决方案
Python中名称解析的注意事项:
类定义块和参数在名称解析的上下文中是特殊的
exec()
。eval()
类定义是可以使用和定义名称的可执行语句。这些引用遵循名称解析的正常规则,但在全局命名空间中查找未绑定的局部变量除外。类定义的命名空间成为类的属性字典。 类块中定义的名称范围仅限于类块;它没有扩展到方法的代码块——这包括理解和生成器表达式,因为它们是使用函数范围实现的。这意味着以下将失败。
您ID
在类定义中声明了一个变量,使其成为class
或static
变量。所以它的范围仅限于类块,因此你不能在comprehensions
.
考虑这些例子,
示例 #1:
class A:
ID = "This is class A."
print(ID)
现在,当您执行时>>>A()
,输出将This is class A
是完全正常的,因为变量的范围ID
仅限于类A
示例 #2:
class B:
L = [ 1, 2, 3, 4, 5, 6, 7]
print([i * 2 for i in L])
现在,当您执行>>>B()
输出时[2, 4, 6, 8, 10, 12, 14]
,这完全没问题,因为列表的范围L
仅限于 B 类
示例#3:
class C:
L = [ 1, 2, 3, 4, 5, 6, 7]
print([L[i] * 2 for i in range(7)])
现在执行>>>C()
将引发一个NameError
说明L
未定义名称。
推荐阅读
- web-crawler - 在经过身份验证的会话中从 OWASP ZAP HUD 攻击 URL
- logging - rsync 的“lq%n%Lrq”默认输出格式是什么意思?
- django - 如何在 django 中显示所选选项中的数据
- javascript - 谷歌社交登录 我可以使用 cookie 吗?
- javascript - Bootstrap 折叠菜单中心项
- javascript - 在浏览器中计时传出串行消息的最佳方法
- android - 启动监控模拟器失败 5554 问题
- postgresql - ormar 中的 Alembic 迁移不起作用(FastAPI)
- python - 卸载 Python 3.8 并使用 Python 3.9 | Ubuntu 18.04
- javascript - client.destroy() 不适用于 v12 discord.js