Python中最内层函数如何访问最外层函数的非局部变量?
让
inner()访问outer()中非局部变量x的方法 在你给出的场景中,middle()内部定义了同名变量x=5,这会遮蔽outer()中的x=0。默认情况下,inner()里的nonlocal x只会绑定到最近的外层作用域(也就是middle())的x,无法直接跳过中间层访问outer()的x。以下是几种可行的解决方式:
方法1:用可变对象包装x
将outer()中的x存入可变容器(比如列表),这样中间层的同名局部变量不会影响容器本身,inner()可以直接修改容器内的元素:
def outer(): x = [0] # 用列表包装x,转为可变对象 def middle(): x = 5 # 此处x为middle的局部变量,与outer的x列表无冲突 def inner(): x[0] += 1 print(x[0]) # 输出1 inner() middle() outer()
方法2:利用函数属性存储x
把x设为outer()函数的属性,通过函数对象直接访问,不受中间层变量遮蔽影响:
def outer(): outer.x = 0 # 将x定义为outer函数的属性 def middle(): x = 5 def inner(): outer.x += 1 print(outer.x) # 输出1 inner() middle() outer()
方法3:通过参数传递outer()的x引用
给middle()添加参数接收outer()的x,再在inner()中用nonlocal绑定该参数:
def outer(): x = 0 def middle(outer_x): # 接收outer的x作为参数 x = 5 def inner(): nonlocal outer_x # 绑定到middle的outer_x参数,即outer的x outer_x += 1 print(outer_x) # 输出1 inner() middle(x) outer()
方法4:用类封装状态替代嵌套函数
如果嵌套层级复杂,用类管理状态会更清晰:
class Outer: def __init__(self): self.x = 0 def middle(self): x = 5 # 局部变量,不影响实例的x属性 def inner(): self.x += 1 print(self.x) # 输出1 inner() outer = Outer() outer.middle()
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

