前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Day4作用域,Python关键字global和nonlocal使用

Day4作用域,Python关键字global和nonlocal使用

原创
作者头像
李鹏华
发布2024-04-25 19:11:51
580
发布2024-04-25 19:11:51

@[TOC](【重学Python】Day4作用域,python关键词global和nonlocal使用)

## 一、概念

作用域是指变量的有效范围。变量并不是在每一个位置都可以访问,访问权限取决于这个变量在哪里赋值,作用域哪个作用域内。在python中的作用域一共分为4种。分别是:

- **L(Local)**:最内层,包含局部变量,比如一个函数/方法内部。

- **E(Enclosing)**:包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。

- **G(Global)**:当前脚本的最外层,比如当前模块的全局变量。

- **B(Built-in)**: 包含了内建的变量/关键字等,最后被搜索。

规则顺序: **L –> E –> G –> B**

先在局部作用域找,然后在闭包函数外的函数找,然后去全局找,然后去内置找。

```python

def function_1():

a = '1'

def function_2():

print(a)

print(b)

print(c)

function_2()

b = 2

function_1()

```

上面的代码能够顺利执行,并打印a和b,c报错name 'c' is not defined。我们在function_2中并没有定义a和b两个变量,在上面代码b=2中,b作为了全局变量,属于全局作用域,没有定义在任何一个函数中。在function_1中定义a,这是一个局部变量,属于局部作用域,在function_1外部并不能访问到它,但是对于function_2中,变量a属于嵌套作用,在function_2中可以访问到,变量c属于局部作用域,在function_2之外无法访问。Python查找一个变量时会按照“局部作用域”、“嵌套作用域”、“全局作用域”和“内置作用域”的顺序进行搜索,前三者我们在上面的代码中已经看到了,所谓的“内置作用域”就是Python内置的那些标识符,我们之前用过的`input`、`print`、`int`等都属于内置作用域。

## 二、全局变量和局部变量

定义在函数内部的变量属于局部作用域,定义在函数之外的属于全局作用域。

局部变量只能在被声明的函数内部访问,全局变量可以在整个程序范围内访问。当我们调用函数时,函数内部的变量会被加入到作用域中。

```python

total = 0

def sum(x,y):

total = x + y #这里total是局部变量

print('函数内total是局部变量,值:',total)

return total

sum(1,2)

print('函数外total是全局变量, 值:',total)

输出

函数内total是局部变量,值: 3

函数外total是全局变量, 值: 0

```

## 三、global和nonlocal关键字

**global**:在函数内部声明全局变量,使得函数内部可以访问和修改全局变量的值

还是上述的例子,我们使用global函数使两个total的值相同

```python

total = 0

def sum(x,y):

global total #不能直接赋值,需先定义

total = x + y

print('函数内total是局部变量,值:',total)

return total

sum(1,2)

print('函数外total是全局变量,值:',total)

输出:

函数内total是局部变量,值: 3

函数外total是全局变量, 值: 3

```

**nonlocal**:用于在嵌套函数中声明外部嵌套作用域中的变量,使得内部函数可以访问和修改外部函数中的变量。

```python

def outer_function():

y = 20

def inner_function():

y = 1

print("内部函数 y 的值:", y)

inner_function()

print("外部函数 y 的值:", y)

outer_function()

输出:

内部函数 y 的值: 1

外部函数 y 的值: 20

```

```python

def outer_function():

y = 20

def inner_function():

nonlocal y

y += 1

print("内部函数 y 的值:", y)

inner_function()

print("外部函数 y 的值:", y)

outer_function()

输出:

内部函数 y 的值: 21

外部函数 y 的值: 21

```

## 四、使用场景

### 1、在函数内部修改全局变量

上面已有

### 2、在嵌套函数中访问外部函数的变量

上面已有

### 3、在闭包中使用外部变量

闭包是一种特殊的函数,可以访问其外部作用域中定义的变量。使用 `nonlocal` 关键字可以在闭包中修改外部变量的值。

```python

def outer():

x = 10

def inner():

nonlocal x

x += 5

return x

return inner

closure = outer()

print(closure())

输出:15

```

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档