在简单命名空间的范围内访问变量

时间:2018-11-25 13:46:49

标签: python

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

作为对此范围/一致性的测试,我做了一个创建简单名称空间的实验,但是没有得到预期的行为。我不明白为什么应该对这种简单的情况进行区别对待,是否有很好的解释?

这是一个简单的例子:

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

运行上面的代码后执行bundle.printx()会导致NameError,因为未定义x。但是我们已经定义了一个函数“ printx”,该函数被束命名空间包围,但是该函数无权访问封闭命名空间中的变量。

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

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 我在这里提供的示例更加明确,具体用于访问封闭范围内的变量。

1 个答案:

答案 0 :(得分:2)

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'定义的,而不是在定义lambda时具有'x'的值。