0

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

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:澄清建议的重复问题不需要修改非本地人,而我的需要。

4

1 回答 1

1

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

本地人()

更新并返回一个表示当前本地符号表的字典。自由变量在函数块中调用时由 locals() 返回,而不是在类块中。请注意,在模块级别,locals() 和 globals() 是同一个字典。

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

此外,根据https://www.python.org/dev/peps/pep-0558/,“locals() 内置函数的语义历来被低估,因此依赖于实现。”

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

于 2022-01-09T23:46:21.900 回答