原文: https://www.programiz.com/python-programming/global-keyword

在本文中,您将了解global关键字,global变量以及何时使用global关键字。

在阅读本文之前,请确保您具有 Python 全局,局部和非局部变量的一些基础知识。


什么是global关键字

在 Python 中,global关键字允许您在当前作用域之外修改变量。 它用于创建全局变量并在局部上下文中对变量进行更改。


global关键字规则

Python 中global关键字的基本规则是:

  • 当我们在函数内部创建变量时,默认情况下它是局部的。
  • 当我们在函数外部定义变量时,默认情况下它是全局变量。 您不必使用global关键字。
  • 我们使用global关键字在函数内部读写全局变量。
  • 在函数外部使用global关键字无效。

global关键字的使用

让我们举个例子。

示例 1:从函数内部访问全局变量

  1. c = 1 # global variable
  2. def add():
  3. print(c)
  4. add()

当我们运行上面的程序时,输出将是:

  1. 1

但是,在某些情况下,我们需要从函数内部修改全局变量。


示例 2:从函数内部修改全局变量

  1. c = 1 # global variable
  2. def add():
  3. c = c + 2 # increment c by 2
  4. print(c)
  5. add()

当我们运行上面的程序时,输出显示错误:

  1. UnboundLocalError: local variable 'c' referenced before assignment

这是因为我们只能访问全局变量,而不能从函数内部对其进行修改。

解决方案是使用global关键字。


示例 3:使用global从函数内部更改全局变量

  1. c = 0 # global variable
  2. def add():
  3. global c
  4. c = c + 2 # increment by 2
  5. print("Inside add():", c)
  6. add()
  7. print("In main:", c)

当我们运行程序时,输出将是:

  1. Inside add(): 2
  2. In main: 2

在以上程序中,我们将c定义为add()函数内部的全局变量。

然后,将变量c增加1,即c = c + 2。 之后,我们调用add()函数。 最后,我们打印全局变量c

可以看到,函数c = 2之外的全局变量也发生了变化。


跨 Python 模块的全局变量

在 Python 中,我们创建一个模块config.py来保存全局变量,并在同一程序中的 Python 模块之间共享信息。

这是我们如何在 python 模块之间共享全局变量的方法。

示例 4:跨 Python 模块共享全局变量

创建一个config.py文件,以存储全局变量

  1. a = 0
  2. b = "empty"

创建一个update.py文件,以更改全局变量

  1. import config
  2. config.a = 10
  3. config.b = "alphabet"

创建一个main.py文件,以测试值的变化

  1. import config
  2. import update
  3. print(config.a)
  4. print(config.b)

当我们运行main.py文件时,输出为

  1. 10
  2. alphabet

在上面,我们创建了三个文件:config.pyupdate.pymain.py

模块config.py存储ab的全局变量。 在update.py文件中,我们导入config.py模块并修改ab的值。 同样,在main.py文件中,我们同时导入了config.pyupdate.py模块。 最后,我们打印并测试全局变量的值,无论它们是否更改。


全局嵌套函数

这是在嵌套函数中使用全局变量的方法。

示例 5:在嵌套函数中使用全局变量

  1. def foo():
  2. x = 20
  3. def bar():
  4. global x
  5. x = 25
  6. print("Before calling bar: ", x)
  7. print("Calling bar now")
  8. bar()
  9. print("After calling bar: ", x)
  10. foo()
  11. print("x in main: ", x)

输出为:

  1. Before calling bar: 20
  2. Calling bar now
  3. After calling bar: 20
  4. x in main: 25

在上面的程序中,我们在嵌套函数bar()中声明了一个全局变量。 在foo()函数内部,xglobal关键字无效。

在调用bar()之前和之后,变量x采用局部变量的值,即x = 20。 在foo()函数之外,变量x将采用bar()函数中定义的值,即x = 25。 这是因为我们在x中使用了global关键字在bar()函数(局部范围)内创建了全局变量。

如果我们在bar()函数内进行任何更改,则这些更改将显示在本地范围之外,即foo()