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