Python 是一门高级编程语言,它支持面向对象编程、函数式编程、模块化编程等多种编程范式。在 Python 中,变量的作用域分为局部作用域、全局作用域和嵌套作用域。其中,局部作用域指的是函数内部的作用域,全局作用域指的是模块内的作用域,嵌套作用域指的是函数内部的函数作用域。在 Python 中,访问外围作用域中的变量需要使用特定的语法和技巧。
一、LEGB 规则
Python 中的变量查找顺序遵循 LEGB 规则,即:Local、Enclosing、Global、Built-in。这个规则指的是 Python 解释器在查找变量时所遵循的顺序。具体来说,它先查找局部作用域(Local),如果没有找到,则查找嵌套作用域(Enclosing),再没有找到,则查找全局作用域(Global),最后查找内置作用域(Built-in)。
二、global 关键字
在 Python 中,使用 global 关键字可以在函数内部访问和修改全局变量。例如:
```
x = 10
def foo():
global x
x += 1
print(x)
foo() # 输出 11
```
在上面的代码中,使用 global 关键字声明了变量 x 是全局变量。在函数内部,对变量 x 的任何修改都会影响到全局作用域中的 x 变量。
三、nonlocal 关键字
如果在嵌套函数中需要访问外围函数的变量,可以使用 nonlocal 关键字。例如:
```
def outer():
x = 10
def inner():
nonlocal x
x += 1
print(x)
inner() # 输出 11
outer()
```
在上面的代码中,使用 nonlocal 关键字声明了变量 x 是外围函数 outer 中的变量。在内部函数 inner 中,对变量 x 的任何修改都会影响到外围函数 outer 中的 x 变量。
四、闭包
在 Python 中,闭包指的是一个函数对象和它所引用的外部变量组成的整体。例如:
```
def outer():
x = 10
def inner():
nonlocal x
x += 1
print(x)
return inner
foo = outer()
foo() # 输出 11
bar = outer()
bar() # 输出 11
```
在上面的代码中,outer 函数返回了一个 inner 函数对象。当调用 foo() 函数时,它会访问并修改外围函数 outer 中的变量 x。当调用 bar() 函数时,它也会访问并修改外围函数 outer 中的变量 x,但是它访问的是一个新的闭包。
五、总结
Python 中访问外围作用域中的变量需要使用特定的语法和技巧。其中,LEGB 规则指定了变量查找的顺序,global 关键字可以在函数内部访问和修改全局变量,nonlocal 关键字可以在嵌套函数中访问外围函数的变量,闭包可以保存外围函数的状态并在多次调用中进行修改。