gpt4 book ai didi

python - 访问简单命名空间封闭范围内的变量

转载 作者:太空宇宙 更新时间:2023-11-04 02:12:16 25 4
gpt4 key购买 nike

在 Python 中,函数可以访问封闭范围内的变量。

作为对此的范围/一致性的测试,我做了一个创建简单命名空间的实验,但没有得到预期的行为。我不明白为什么要区别对待这个简单的案例,有没有好的解释?

这是一个简单的例子:

import types
bunch = types.SimpleNamespace(
x = 5,
y = 12,
printx = lambda: print(x)
)

运行上述代码后执行 bunch.printx() 将导致 NameError,因为 x 未定义。但是我们已经定义了一个包含在 bunch 命名空间中的函数“printx”,但该函数无法访问封闭命名空间中的变量。

相比之下,将代码 bunch.py​​ 作为外部文件导入会将对象放置在 bunch 命名空间中,并按预期访问封闭命名空间中的变量:

束.py:

x = 5,
y = 12,
printx = lambda: print(x)

运行以下代码将导致按预期打印 5:

import bunch
bunch.printx()

我确实找到了这个问题,可能是相关的:Python: Access from within a lambda a name that's in the scope but not in the namespace我在此处提供的示例更清楚地说明了访问封闭范围内的变量。

最佳答案

python 中的每个函数对象都有 3 个属性:

  • 常量
  • 本地人
  • 全局变量

局部变量定义在函数内部,全局变量定义在函数外部。查看您要执行的字节码:

dis.dis(bunch.printx)
6 0 LOAD_GLOBAL 0 (print)
2 LOAD_GLOBAL 1 (x)
4 CALL_FUNCTION 1
6 RETURN_VALUE

您正在尝试在全局范围内查找变量“x”。在您执行函数的命名空间中,没有这样的全局变量。
lambda 是使用全局变量“x”定义的,而不是“x”在 lambda 定义期间的值。

关于python - 访问简单命名空间封闭范围内的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53468108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com