157 lines
3.4 KiB
Markdown
157 lines
3.4 KiB
Markdown
---
|
||
title: 变量作用域
|
||
date: 2020-09-19 17:25:10
|
||
tags: [Python]
|
||
categories: [Python]
|
||
author: Anges黎梦
|
||
---
|
||
|
||
### 变量作用域
|
||
|
||
> 变量定义之后,在程序中可以使用/访问的区域。
|
||
>
|
||
>如果超出这个区域,则无法访问该变量。
|
||
>
|
||
>一般,分为局部变量,和全局变量。
|
||
|
||
### 代码运行
|
||
|
||
> 代码在运行过程中,执行过的内容,所创建的变量在接下来的执行过程中可以调用。
|
||
>
|
||
> 若执行中产生分支,若两个分支变量不一致,不同分支创建了不同变量。
|
||
>
|
||
> 则只有执行过的分支中的变量会被创建。
|
||
|
||
|
||
### 局部变量
|
||
|
||
> 局部变量,是指在某一个区域内定义,并使用的变量,它只在区域内有效。
|
||
|
||
#### if 语句
|
||
|
||
> if 语句中定义的变量,在执行之后生效。
|
||
|
||
**示例代码**:
|
||
```python
|
||
if False:
|
||
a = 1
|
||
else:
|
||
print(a)
|
||
print(a)
|
||
```
|
||
|
||
在上述示例中,如果判断条件为**False**,那么去执行**else**中的代码。此时**a**并没有被定义,执行就会报错:
|
||
|
||
**报错信息**:
|
||
```python
|
||
NameError: name 'a' is not defined
|
||
```
|
||
|
||
如果判断条件为**True**,那么执行**if**中的代码,此时**a**已经被定义,再执行**print**就不会报错。
|
||
|
||
#### while
|
||
|
||
> while 语句中定义的变量,在执行之后生效。
|
||
|
||
**示例代码**:
|
||
```python
|
||
a = 11
|
||
while a <=10:
|
||
a += 1
|
||
b = a
|
||
print(b)
|
||
```
|
||
|
||
在上述示例中,如果 **a > 10**,**while** 中的语句并没有被执行,此时 **b** 并没有被定义,执行就会报错:
|
||
|
||
**报错信息**:
|
||
```python
|
||
NameError: name 'b' is not defined
|
||
```
|
||
|
||
若 **a = 1**,那么则去执行 **while** 中的代码。**b** 已经定义,则不会报错。
|
||
|
||
#### for
|
||
|
||
> for 语句中定义的变量,在执行之后生效。(与if while相同)
|
||
|
||
**示例代码**:
|
||
```python
|
||
o = 0
|
||
for i in range(0, 10):
|
||
o += i
|
||
print(i)
|
||
```
|
||
|
||
#### 函数 def
|
||
|
||
**示例代码**:
|
||
```python
|
||
def func_1():
|
||
# func_param = 0
|
||
# print(func_param) # 局部变量使用
|
||
# func_1()
|
||
# print(func_param) # 在函数外使用局部变量
|
||
```
|
||
|
||
上述示例中,**func_param** 为函数内定义的变量,在函数外是禁止使用。
|
||
|
||
**报错信息**:
|
||
```python
|
||
NameError: name 'func_param' is not defined
|
||
```
|
||
|
||
### 全局变量
|
||
|
||
> 在文件全局任意位置都可以使用都变量
|
||
>
|
||
> 他们在任意位置都可以使用,但是不能直接在局部中修改。
|
||
|
||
#### 例子一
|
||
|
||
**示例代码**:
|
||
```python
|
||
msg = "这是一个全局变量"
|
||
def msg_print():
|
||
msg = "给msg重新赋值"
|
||
print(msg)
|
||
msg_print()
|
||
print(msg)
|
||
```
|
||
|
||
在上述例子中,**msg** 为全局变量,我们在函数内定义一个 **msg变量**,给他赋不同的值。
|
||
查看输出结果可以发现,全局变量并没有被改变。
|
||
这里只是全局和局部两个变量定义了同一个名字而已。
|
||
|
||
**响应结果**:
|
||
```python
|
||
输出结果
|
||
给msg重新赋值
|
||
这是一个全局变量
|
||
```
|
||
|
||
#### 例子二
|
||
|
||
**示例代码**:
|
||
```python
|
||
print("---------------")
|
||
msg = "这是一个全局变量"
|
||
print(msg)
|
||
def msg_print_1():
|
||
global msg # 把msg声明为全局变量
|
||
msg = "给msg重新赋值" # 对全局变量msg的修改
|
||
print(msg)
|
||
msg_print_1()
|
||
print(msg)
|
||
```
|
||
|
||
在第二个例子中,在函数内 使用 **global** 把 **msg** 声明为全局变量,此时就可以对全局变量进行修改。
|
||
|
||
**响应结果**:
|
||
```python
|
||
---------------
|
||
这是一个全局变量
|
||
给msg重新赋值
|
||
给msg重新赋值
|
||
```
|