Python中“全局”关键字的使用

Python中“全局”关键字的使用

通过阅读文档,我了解到Python有一个单独的函数命名空间,如果我想在这个函数中使用全局变量,我需要使用global.

我正在使用Python2.7,我尝试了这个小测试

>>> sub = ['0', '0', '0', '0']>>> def getJoin():...     return '.'.join(sub)...>>> getJoin()'0.0.0.0'

即使没有global..我能够毫无问题地访问全局变量。

我有遗漏什么吗?另外,以下是Python文档中的内容:

不能将全局语句中列出的名称定义为形式参数或for循环控制目标、类定义、函数定义或导入语句。

虽然形式参数和类定义对我来说是有意义的,但我无法理解对for循环控制目标和函数定义的限制。


神不在的星期二
浏览 664回答 4
4回答

幕布斯6054654

而您可以访问全局变量,而不需要使用global关键字,如果要修改它们,则必须使用global关键词。例如:foo = 1def test():     foo = 2 # new local foodef blub():     global foo     foo = 3 # changes the value of the global foo在你的例子中,你只是访问列表sub.

当年话下

这是访问名称和绑定在一个范围内。如果您只是查找一个变量来读取它的值,那么您可以访问全局范围和本地范围。但是,如果将名称不位于本地作用域中的变量赋值给变量,则绑定该名称进入该范围(如果该名称也作为全局名称存在,则将其隐藏)。如果希望能够为全局名称分配,则需要告诉解析器使用全局名称,而不是绑定新的本地名称-这就是“全局”关键字的作用。块中任何位置的绑定都会导致该块中任何位置的名称受到绑定,这可能会导致一些非常奇怪的结果(例如,在以前工作的代码中突然出现了UnideLocalError)。>>>&nbsp;a&nbsp;=&nbsp;1>>>&nbsp;def&nbsp;p(): &nbsp;&nbsp;&nbsp;&nbsp;print(a)&nbsp;#&nbsp;accessing&nbsp;global&nbsp;scope,&nbsp;no&nbsp;binding&nbsp;going&nbsp;on>>>&nbsp;def&nbsp;q(): &nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;3&nbsp;#&nbsp;binding&nbsp;a&nbsp;name&nbsp;in&nbsp;local&nbsp;scope&nbsp;-&nbsp;hiding&nbsp;global &nbsp;&nbsp;&nbsp;&nbsp;print(a)>>>&nbsp;def&nbsp;r(): &nbsp;&nbsp;&nbsp;&nbsp;print(a)&nbsp;#&nbsp;fail&nbsp;-&nbsp;a&nbsp;is&nbsp;bound&nbsp;to&nbsp;local&nbsp;scope,&nbsp;but&nbsp;not&nbsp;assigned&nbsp;yet &nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;4>>>&nbsp;p()1>>>&nbsp;q()3>>>&nbsp;r()Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<pyshell#35>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module> &nbsp;&nbsp;&nbsp;&nbsp;r() &nbsp;&nbsp;File&nbsp;"<pyshell#32>",&nbsp;line&nbsp;2,&nbsp;in&nbsp;r&nbsp;&nbsp;&nbsp;&nbsp;print(a)&nbsp;#&nbsp;fail&nbsp;-&nbsp;a&nbsp;is&nbsp;bound&nbsp;to&nbsp;local&nbsp;scope,&nbsp;but&nbsp;not&nbsp;assigned&nbsp;yetUnboundLocalError:&nbsp; &nbsp;&nbsp;local&nbsp;variable&nbsp;'a'&nbsp;referenced&nbsp;before&nbsp;assignment>>>

不负相思意

另一个回答你的问题。在Python中需要了解的另一件重要的事情是,在每个范围内,名称要么是本地的,要么是全局的。考虑这一点,例如:value&nbsp;=&nbsp;42def&nbsp;doit(): &nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;value &nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;0doit()print&nbsp;value你可能猜到value = 0语句将分配给局部变量,而不会影响在doit()功能。你可能会更惊讶地发现上面的代码不会运行。声明print value在函数内部生成一个UnboundLocalError.原因是Python注意到,在函数的其他地方,您指定了名称value,而且value无处宣布global..这使得它成为一个局部变量。但是当您试图打印它时,本地名称还没有定义。Python在本例中不后退以全局变量的形式查找名称,就像其他语言所做的那样。实际上,如果定义了同名局部变量,则无法访问全局变量。任何地方在功能上。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python