2018-04-19 21:45:35 +08:00
|
|
|
|
初识 Python: global 关键字
|
2018-02-23 22:57:19 +08:00
|
|
|
|
======
|
2018-04-19 21:45:35 +08:00
|
|
|
|
|
|
|
|
|
在读这篇文章之前,确保你对 [Python 全局、本地和非本地变量][1] 有一定的基础。
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
### global 关键字简介
|
|
|
|
|
|
|
|
|
|
在 Python 中,`global` 关键字允许你修改当前范围之外的变量。它用于创建全局变量并在本地上下文中更改变量。
|
|
|
|
|
|
|
|
|
|
### global 关键字的规则
|
2018-04-19 21:45:35 +08:00
|
|
|
|
|
2018-02-23 22:57:19 +08:00
|
|
|
|
在 Python 中,有关 `global` 关键字基本规则如下:
|
|
|
|
|
|
|
|
|
|
* 当我们在一个函数中创建一个变量时,默认情况下它是本地变量。
|
|
|
|
|
* 当我们在一个函数之外定义一个变量时,默认情况下它是全局变量。你不必使用 `global` 关键字。
|
|
|
|
|
* 我们使用 `global` 关键字在一个函数中来读写全局变量。
|
|
|
|
|
* 在一个函数外使用 `global` 关键字没有效果。
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
### 使用 global 关键字(含示例)
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
我们来举个例子。
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
#### 示例 1:从函数内部访问全局变量
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
```
|
|
|
|
|
c = 1 # 全局变量
|
|
|
|
|
def add():
|
|
|
|
|
print(c)
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
add()
|
|
|
|
|
```
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
运行程序,输出为:
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
```
|
|
|
|
|
1
|
|
|
|
|
```
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
但是我们可能有一些场景需要从函数内部修改全局变量。
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
#### 示例 2:在函数内部修改全局变量
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
```
|
|
|
|
|
c = 1 # 全局变量
|
|
|
|
|
def add():
|
|
|
|
|
c = c + 2 # 将 c 增加 2
|
|
|
|
|
print(c)
|
|
|
|
|
add()
|
|
|
|
|
```
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
运行程序,输出显示错误:
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
```
|
|
|
|
|
UnboundLocalError: local variable 'c' referenced before assignment
|
|
|
|
|
```
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
这是因为在函数中,我们只能访问全局变量但是不能修改它。
|
|
|
|
|
|
|
|
|
|
解决的办法是使用 `global` 关键字。
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
#### 示例 3:使用 global 在函数中改变全局变量
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
```
|
|
|
|
|
c = 0 # global variable
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
def add():
|
|
|
|
|
global c
|
|
|
|
|
c = c + 2 # 将 c 增加 2
|
|
|
|
|
print("Inside add():", c)
|
|
|
|
|
|
|
|
|
|
add()
|
|
|
|
|
print("In main:", c)
|
|
|
|
|
```
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
运行程序,输出为:
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
```
|
|
|
|
|
Inside add(): 2
|
|
|
|
|
In main: 2
|
|
|
|
|
```
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
在上面的程序中,我们在 `add()` 函数中定义了 `c` 将其作为全局关键字。
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
然后,我们给变量 `c` 增加 `2`,即 `c = c + 2`。之后,我们调用了 `add()` 函数。最后,打印全局变量 `c`。
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
正如我们所看到的,在函数外的全局变量也发生了变化,`c = 2`。
|
|
|
|
|
|
|
|
|
|
### Python 模块中的全局变量
|
|
|
|
|
|
|
|
|
|
在 Python 中,我们创建一个单独的模块 `config.py` 来保存全局变量并在同一个程序中的 Python 模块之间共享信息。
|
|
|
|
|
|
|
|
|
|
以下是如何通过 Python 模块共享全局变量。
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
#### 示例 4:在Python模块中共享全局变量
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
创建 `config.py` 文件来存储全局变量
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
```
|
|
|
|
|
a = 0
|
|
|
|
|
b = "empty"
|
|
|
|
|
```
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
创建 `update.py` 文件来改变全局变量
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
```
|
|
|
|
|
import config
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
config.a = 10
|
|
|
|
|
config.b = "alphabet"
|
|
|
|
|
```
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
创建 `main.py` 文件来测试其值的变化
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
```
|
|
|
|
|
import config
|
|
|
|
|
import update
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
print(config.a)
|
|
|
|
|
print(config.b)
|
|
|
|
|
```
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
运行 `main.py`,输出为:
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
```
|
|
|
|
|
10
|
|
|
|
|
alphabet
|
|
|
|
|
```
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
在上面,我们创建了三个文件: `config.py`, `update.py` 和 `main.py`。
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
在 `config.py` 模块中保存了全局变量 `a` 和 `b`。在 `update.py` 文件中,我们导入了 `config.py` 模块并改变了 `a` 和 `b` 的值。同样,在 `main.py` 文件,我们导入了 `config.py` 和 `update.py` 模块。最后,我们打印并测试全局变量的值,无论它们是否被改变。
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
### 在嵌套函数中的全局变量
|
|
|
|
|
|
|
|
|
|
以下是如何在嵌套函数中使用全局变量。
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
#### 示例 5:在嵌套函数中使用全局变量
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
```
|
|
|
|
|
def foo():
|
|
|
|
|
x = 20
|
|
|
|
|
def bar():
|
|
|
|
|
global x
|
|
|
|
|
x = 25
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
print("Before calling bar: ", x)
|
|
|
|
|
print("Calling bar now")
|
|
|
|
|
bar()
|
|
|
|
|
print("After calling bar: ", x)
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
foo()
|
|
|
|
|
print("x in main : ", x)
|
|
|
|
|
```
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
输出为:
|
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
```
|
|
|
|
|
Before calling bar: 20
|
|
|
|
|
Calling bar now
|
|
|
|
|
After calling bar: 20
|
|
|
|
|
x in main : 25
|
|
|
|
|
```
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
在上面的程序中,我们在一个嵌套函数 `bar()` 中声明了全局变量。在 `foo()` 函数中, 变量 `x` 没有全局关键字的作用。
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
2018-04-19 21:45:35 +08:00
|
|
|
|
调用 `bar()` 之前和之后, 变量 `x` 取本地变量的值,即 `x = 20`。在 `foo()` 函数之外,变量 `x` 会取在函数 `bar()` 中的值,即 `x = 25`。这是因为在 `bar()` 中,我们对 `x` 使用 `global` 关键字创建了一个全局变量(本地范围)。
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
如果我们在 `bar()` 函数内进行了任何修改,那么这些修改就会出现在本地范围之外,即 `foo()`。
|
|
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
via: [https://www.programiz.com/python-programming/global-keyword](https://www.programiz.com/python-programming/global-keyword)
|
|
|
|
|
|
|
|
|
|
作者:[programiz][a]
|
|
|
|
|
译者:[MjSeven](https://github.com/MjSeven)
|
2018-04-19 21:45:35 +08:00
|
|
|
|
校对:[wxy](https://github.com/wxy)
|
2018-02-23 22:57:19 +08:00
|
|
|
|
|
|
|
|
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
|
|
|
|
|
|
|
|
|
[a]:https://www.programiz.com
|
|
|
|
|
[1]:https://www.programiz.com/python-programming/global-local-nonlocal-variables
|