## 二、Python 变量的作用域类型
### 2.1 局部作用域(Local,L)
局部作用域是在函数内部定义的变量所具有的作用域。这些变量只能在定义它们的函数内部访问,函数外部无法直接访问。
```python
def test_function():
# 局部变量
local_variable = 10
print(local_variable)
test_function()
# 以下代码会报错,因为 local_variable 是局部变量,在函数外部无法访问
# print(local_variable)
```
### 2.2 闭包作用域(Enclosing,E)
闭包作用域存在于嵌套函数中,当一个内部函数引用了外部函数中的变量时,就形成了闭包。外部函数的变量作用域就是闭包作用域,内部函数可以访问这些变量。
```python
def outer_function():
# 外部函数的变量,具有闭包作用域
enclosing_variable = 20
def inner_function():
print(enclosing_variable)
return inner_function
closure = outer_function()
closure()
```

### 2.3 全局作用域(Global,G)
全局作用域是在模块(Python 文件)的顶层定义的变量所具有的作用域。这些变量在整个模块中都可以访问,并且可以通过 `global` 关键字在函数内部进行修改。
```python
# 全局变量
global_variable = 30
def access_global_variable():
global_variable = 50
print(global_variable)
access_global_variable()
print(global_variable)
```

如果全局变量是可变类型(如列表、字典等),在函数内部对其进行原地修改(如使用 `append`、`extend`、`update` 等方法)时,不需要使用 `global` 关键字。因为可变类型的对象在内存中可以直接被修改,而不需要重新赋值。示例如下:
```python
# 定义全局变量,类型为列表
global_list = [1, 2, 3]
def modify_global_list():
# 对全局列表进行原地修改
global_list.append(4)
print(global_list)
# 调用函数
modify_global_list()
print(global_list) # 全局列表的值已被修改
```
在这个例子中,`modify_global_list` 函数内部使用 `append` 方法对全局列表 `global_list` 进行了原地修改,由于没有对 `global_list` 进行重新赋值,因此不需要使用 `global` 关键字。

### 2.4 内置作用域(Built-in,B)
内置作用域是 Python 内置函数和内置对象所在的作用域,这些函数和对象在任何地方都可以直接使用,无需导入任何模块。
```python
# 使用内置函数 len
my_list = [1, 2, 3]
length = len(my_list)
print(length)
```
### 2.5 LEGB 规则
当 Python 解释器在查找一个变量时,会按照 LEGB 规则依次在局部作用域(L)、闭包作用域(E)、全局作用域(G)和内置作用域(B)中进行查找,直到找到该变量或者抛出 `NameError` 异常。
```python
# 全局变量
x = 10
def outer():
# 闭包作用域变量
x = 20
def inner():
# 局部变量
x = 30
print(x)
inner()
outer()
```
在这个例子中,`inner` 函数内部的 `print(x)` 语句会先在局部作用域查找 `x`,找到局部变量 `x` 的值为 `30` 并输出。

566

被折叠的 条评论
为什么被折叠?



