>>> from env_helper import info; info()
页面更新时间: 2024-01-14 09:33:25
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-16-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

3.5. global 语句

为了全局的数据使用,我们会定义很多的全局变量,但是我们不要随便的修改,这是很危险的,今天就出现了一个问题,就是修改了全局变量,导致结果错误,一直没发现.

  1. 全局变量用的时候要判断,是否还是原来的数据.

  2. 要不就是把全局变量转化到局部变量在进行修改使用.

如果需要在一个函数内修改全局变量,就使用 global 语句。 如果在函数的顶部有 global eggs 这样的代码,它就告诉 Python : “在这个函数中, eggs 指的是全局变量,所以不要用这个名字创建一个局部变量。” 例如,在文件编辑器中输入以下代码:

>>> def spam():
>>>     global eggs
>>>     eggs = 'spam'
>>> eggs = 'global'
>>> spam()
>>> print(eggs)
spam

运打该程序,最后的 print() 调用将输出:

因为 eggsspam() 的顶部被声明为 global , 所以当 eggs 被赋值为 'spam' , 赋值发生在全局作用域的 spam 上。 没有创建局部 spam 变量。

有4条法则,来区分一个变量是处于局部作用域还是全局作用域:

  1. 如果变量在全局作用域中使用(即在所有函数之外),它就总是全局变量。

  • 如果在一个函数中,有针对该变量的 global 语句,它就是全局变量。

  • 否则,如果该变量用于函数中的赋值语句,它就是局部变量。

  • 但是,如果该变量没有用在赋值语句中,它就是全局变量。

为了更好地理解这些法则,这里有一个例子程序。 在文件编辑器中输入以下代码:

>>> def spam():
>>>
>>>     global eggs
>>>
>>>     eggs = 'spam'  # this is the global
>>>
>>> def bacon():
>>>
>>>     eggs ='bacon' # this is a local def ham():
>>> def ham():
>>>
>>>     eggs ='bacon' # this is a local def ham():
>>>     print(eggs) # this is the global
>>>
>>> eggs = 42  # this is the global spam()
>>> spam()
>>> print(eggs)
spam

上面的输出为 spam

spam() 函数中,eggs 是全局 eggs 变量, 因为在函数的开始处,有针对 eggs 变量的 global 语句 。 在 bacon() 中,eggs 是局部变量, 因为在该函数中有针对它的赋值语句。 在 ham() 中, eggs 是全局变量, 因为在这个函数中,既没有赋值语句, 也没有针对它的 global 语句。

在一个函数中,一个变量要么总是全局变量, 要么总是局部变量。函数中的代码 没有办法先使用名为 eggs 的局部变量, 稍后又在同一个函数中使用全局 eggs 变量。

如果想在一个函数中修改全局变量中存储的值, 就必须对该变量使用 global 语句。

在一个函数中,如果试图在局部变量赋值之前就使用它,像下面的程序这样,Python就会报错:

>>> def spam():
>>>     print(eggs) # ERROR!
>>>     eggs = 'spam local'
>>> eggs ='global'
>>> spam()
---------------------------------------------------------------------------

UnboundLocalError                         Traceback (most recent call last)

Cell In [4], line 5
      3     eggs = 'spam local'
      4 eggs ='global'
----> 5 spam()


Cell In [4], line 2, in spam()
      1 def spam():
----> 2     print(eggs) # ERROR!
      3     eggs = 'spam local'


UnboundLocalError: cannot access local variable 'eggs' where it is not associated with a value

运行前面的程序,会产生出错信息。

发生这个错误是因为, Python 看到 spam() 函数中有针对 eggs 的赋值语句,因此认为 eggs 变量是局部变量。 但是因为 print(eggs) 的执行在 eggs 赋值之前,局部变 量 eggs 并不存在。 Python不会退回到使用全局 eggs 变量。