>>> 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
语句¶
为了全局的数据使用,我们会定义很多的全局变量,但是我们不要随便的修改,这是很危险的,今天就出现了一个问题,就是修改了全局变量,导致结果错误,一直没发现.
全局变量用的时候要判断,是否还是原来的数据.
要不就是把全局变量转化到局部变量在进行修改使用.
如果需要在一个函数内修改全局变量,就使用 global
语句。
如果在函数的顶部有 global eggs
这样的代码,它就告诉 Python :
“在这个函数中, eggs
指的是全局变量,所以不要用这个名字创建一个局部变量。”
例如,在文件编辑器中输入以下代码:
>>> def spam():
>>> global eggs
>>> eggs = 'spam'
>>> eggs = 'global'
>>> spam()
>>> print(eggs)
spam
运打该程序,最后的 print()
调用将输出:
因为 eggs
在 spam()
的顶部被声明为 global
, 所以当 eggs
被赋值为 'spam'
, 赋值发生在全局作用域的 spam
上。 没有创建局部
spam
变量。
有4条法则,来区分一个变量是处于局部作用域还是全局作用域:
如果变量在全局作用域中使用(即在所有函数之外),它就总是全局变量。
如果在一个函数中,有针对该变量的
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
变量。