动态绑定非局部变量

Dynamically binding nonlocal variables

为了将名称绑定到外部作用域中的变量,我们可以使用 globalnonlocal 关键字,但要使用事先已知的变量名称,例如,

x0 = 0
def f1():
    x1 = 1
    def f2():
        x2 = 2
        def f3():
            x3 = 3
            def h():
                global x0  # cannot use nonlocal, in case you're curious like me
                nonlocal x1, x2, x3  
                x0 += x0
                x1 += x1
                x2 += x2
                x3 += x3
                print(f'x0: {x0}, x1: {x1}, x2: {x2}, x3: {x3}')
            return h
        return f3()
    return f2()

call_h = f1()
call_h()  # print on screen: x0: 0, x1: 2, x2: 4, x3: 6

要将名称动态绑定到全局变量,我们可以使用 globals() 字典代替 (globals()['x0'])。有没有办法用非局部变量来做到这一点?有nonlocals()['x1']之类的东西吗?

编辑 1:澄清 建议的重复 question 不需要修改非本地人,而我的需要。

不,对 locals() 的修改可能不起作用,因此肯定没有称为 nonlocals() 的明确指定的函数。来自 https://docs.python.org/3/library/functions.html#locals :

本地人()

更新和return表示当前本地符号table的字典。自由变量在函数块中调用时由 locals() 编辑 return,但在 class 块中不调用。请注意,在模块级别,locals() 和 globals() 是同一个字典。

注:本词典内容不得修改;更改可能不会影响解释器使用的局部变量和自由变量的值。

此外,根据 https://www.python.org/dev/peps/pep-0558/,“locals() 内置的语义在历史上一直未明确说明,因此依赖于实现。”

如果本地人是这样,那么外地人可能也是如此。