Python 变量作用域、global 关键字与闭包作用域深度解析 第二部分

## 二、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` 并输出。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值