88 lines
3.7 KiB
Markdown
88 lines
3.7 KiB
Markdown
# python3小白课:变量作用域
|
||
|
||
我们定义的变量,是有作用域范围的。作用域是什么呢?就是这个变量在哪里能被调用,在哪里不能。
|
||
|
||
就拿我们学过的没在函数里面直接定义的变量和在函数内部定义的变量来说,它们的作用域就不同。
|
||
|
||
我们分成如下两种:
|
||
|
||
* 全局变量。在函数外部定义的全局可用的变量。
|
||
* 局部变量。在函数内部定义的,也包括参数,仅在函数内部可调用的变量。
|
||
|
||
每次函数在执行时,系统会自动给这个函数的调用分配一块临时内存空间用来存储局部变量,当函数调用结束,这块内存空间就会被释放,局部变量也就失效了。
|
||
|
||
但全局变量是在python脚本运行时分配的内存空间,在函数外可以调用,在函数内也可以调用的。
|
||
|
||
我们来看点例子:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
name = "小白"
|
||
def test():
|
||
print(name)
|
||
test()
|
||
```
|
||
|
||
运行后可以发现,我们能在函数中访问到全局变量。
|
||
|
||
我们再来看下如下代码:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
name = "小白"
|
||
def test():
|
||
name = "小黑"
|
||
print(name)
|
||
test()
|
||
```
|
||
|
||
我们来运行一下,发现输出的结果为`小黑`。
|
||
|
||
这是因为在函数内部,重新定义了`name`变量,这样前面定义的全局变量就被遮蔽了。那么我们要不试试先输出全局变量看下?
|
||
|
||
```python
|
||
# coding:utf-8
|
||
name = "小白"
|
||
def test():
|
||
print(name)
|
||
name = "小黑"
|
||
print(name)
|
||
test()
|
||
```
|
||
|
||
运行发现,程序报错了,提示`UnboundLocalError: local variable 'name' referenced before assignment`。即告诉你局部变量`name`还没有定义。还是那个原因,因为在函数内部有定义`name`局部变量的语句,全局变量就被遮蔽了,所以按python的规定,在运行第4行的时候就找不到局部变量`name`了。
|
||
|
||
为了避免在函数中对全局变量赋值,我们可以使用`global`语句来声明全局变量,上述错误代码可以改成这样:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
name = "小白"
|
||
def test():
|
||
global name
|
||
print(name)
|
||
name = "小黑"
|
||
print(name)
|
||
test()
|
||
print(name)
|
||
```
|
||
|
||
我们可以看到,这次不再报错了,并且首先打印出了`小白`,然后打印出了`小黑`,最后打印出了`小黑`。
|
||
|
||
这是因为我们把`name`声明为了全局变量,后续一切更改和打印都是基于全局变量的操作,就没有局部变量存在了。
|
||
|
||
关于全局变量、局部变量大家可以根据自己的业务需要来再仔细研究一下,但为了大家写代码和理解方便,通常来讲,如果在函数中调用了全局变量的,不要修改它的值,以免造成其他问题。如果确实需要修改全局变量的,可以使用`global`语句将变量定义为全局变量,后续的修改就是基于全局变量的了。
|
||
|
||
|
||
|
||
### 单词释义
|
||
|
||
| 单词 | 释义 |
|
||
| ----------------- | ------------------------------------------------------------ |
|
||
| test | 测试 |
|
||
| UnboundLocalError | unbound,unbind的过去式,未绑定的,local,局部,本地,error,错误 |
|
||
| local | 局部,本地 |
|
||
| variable | 变量 |
|
||
| referenced | reference的过去式或被动式,理解为被引用 |
|
||
| before | 在...之前 |
|
||
| assignment | 分派,布置,理解为赋值吧这里 |
|
||
| global | 全球的,全世界的,这里理解为全局 | |