频道栏目
首页 > 程序开发 > 软件开发 > 其他 > 正文
python global语句解析
2018-08-14 15:28:40           
收藏   我要投稿

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

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

eggs = 'global'
spam()
print(eggs)

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

spam

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

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

如果变量在全局作用域中使用(即在所有函数之外),它就总是全局变量。
如果在一个函数中,有针对该变量的 global 语句,它就是全局变量。
否则,如果该变量用于函数中的赋值语句,它就是局部变量。
但是,如果该变量没有用在赋值语句中,它就是全局变量。

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


def spam():
 global eggs
eggs = 'spam' # this is the global

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

eggs = 42 # this is the global
spam()
print(eggs)

在 spam()函数中,eggs 是全局 eggs 变量,因为在函数的开始处,有针对 eggs变量的 global 语句。在 bacon()中,eggs 是局部变量,因为在该函数中有针对它的赋值语句。在 ham()中,eggs 是全局变量,因为在这个函数中,既没有赋值语句,也没有针对它的 global 语句。如果运行 sameName3.py,输出将是:


spam

在一个函数中,一个变量要么总是全局变量,要么总是局部变量。函数中的代码没有办法先使用名为 eggs 的局部变量,稍后又在同一个函数中使用全局 eggs 变量。如果想在一个函数中修改全局变量中存储的值,就必须对该变量使用 global语句。
在一个函数中,如果试图在局部变量赋值之前就使用它,像下面的程序这样,Python就会报错。为了看到效果,请在文件编辑器中输入以下代码,并保存为sameName4.py:


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

eggs = 'global'
spam()

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


Traceback (most recent call last):
File "C:/test3784.py", line 6, in 
spam()
File "C:/test3784.py", line 2, in spam
print(eggs) # ERROR!
UnboundLocalError: local variable 'eggs' referenced before assignment

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

点击复制链接 与好友分享!回本站首页
上一篇:Django项目解析
下一篇:docker 运行 springCloud项目教程
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站