动态绑定非局部变量
Dynamically binding nonlocal variables
为了将名称绑定到外部作用域中的变量,我们可以使用 global
或 nonlocal
关键字,但要使用事先已知的变量名称,例如,
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() 内置的语义在历史上一直未明确说明,因此依赖于实现。”
如果本地人是这样,那么外地人可能也是如此。
为了将名称绑定到外部作用域中的变量,我们可以使用 global
或 nonlocal
关键字,但要使用事先已知的变量名称,例如,
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() 内置的语义在历史上一直未明确说明,因此依赖于实现。”
如果本地人是这样,那么外地人可能也是如此。