global关键字用于在函数或其他局部范围内使用全局变量。非局部声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数中的变量。本文主要介绍Python中全局和非局部的用法,有需要的朋友可以参考一下。
非局部和全局也容易混淆。简单记录下你的理解。
解释
global
总之,范围是全局的,也就是这个变量对应的地址的值会被修改。
全局语句是应用于整个当前代码块的语句。这意味着列出的标识符将被解释为全局变量。虽然自由变量可能引用了一个全局变量而没有被声明为全局变量。
全局语句中列出的名称不能用在全局语句之前的文本代码块中。
global语句中列出的名称不能定义为形参,也不能在for循环控制目标、类定义、函数定义、import语句或变量注释中定义。
的当前实现并不强制执行这些限制,但是程序不应该滥用这种自由,因为将来的实现可能会强制执行这些限制或者悄悄地改变程序的意义。
程序员注:global是指向解析器的指令。它仅适用于与全局语句同时解析的代码。特别是提供给内置exec()函数的字符串或code对象中包含的全局语句不会影响包含函数调用的代码块,这个字符串中包含的代码也不会受到包含函数调用的代码中全局语句的影响。eval()和compile()函数也是如此。
一、global
1.global关键字用于在函数或其他局部范围内使用全局变量。但是,如果不修改全局变量,就不需要使用global关键字。
gcount=0
def全局测试():
gcount=1
打印(g计数)
全局测试()
上面的代码会报错:如果在第一行定义了全局变量,而在内部函数中引用和修改了外部函数,python会将其视为局部变量,并且会报错,因为其gcount不是由内部函数定义和赋值的。
2.如果要局部修改全局变量,则局部声明全局变量。
gcount=0
def全局测试():
全球账户
gcount=1
打印(g计数)
全局测试()
上面的输出是:1
3.如果没有局部声明全局变量,也没有修改全局变量,就可以正常使用。
gcount=0
def全局测试():
打印(g计数)
全局测试()
上面的输出是:0
二、nonlocal
非局部的
它只在闭包内部生效,作用域在闭包内部。外部函数和内部函数都会影响它,但在闭包之外不会。
非局部语句使列出的标识符引用除全局变量之外的最近的封闭范围内的先前绑定的变量。这很重要,因为绑定的默认行为是首先搜索本地名称空间。该语句允许封装的代码将变量重新绑定到局部范围,而不是全局(模块)范围。
非局部语句中列出的名称与全局语句中列出的名称不同,它们必须引用封闭范围内的现有绑定(无法明确确定新绑定应创建的范围)。
1.非局部声明的变量不是局部变量或全局变量,而是外部嵌套函数中的变量。
def make_counter():
计数=0
定义计数器():
非局部计数
计数=1
返回计数
返回计数器
定义make_counter_test():
mc=make _计数器()
打印(mc())
打印(mc())
打印(mc())
make _计数器_测试()
上面的输出是:
一个
2
三
三、混合使用
定义scope_test():
def do_local():
Spam='local Spam' #这个函数定义了另一个spam字符串变量,它的生命周期只在这个函数内。这里的垃圾邮件和外层的垃圾邮件是两个变量。如果垃圾邮件=垃圾邮件“本地垃圾邮件”被写入,将会报告一个错误。
def do_nonlocal():
非本地垃圾邮件#使用外部垃圾邮件变量。
spam='非本地spam '
def do_global():
全球垃圾邮件
垃圾邮件='全局垃圾邮件'
spam='测试垃圾邮件'
do_local()
打印('在本地分配后':垃圾邮件)
do_nonlocal()
打印('非本地分配后:',垃圾邮件)
do_global()
打印('全局分配后:',垃圾邮件)
范围_测试()
打印('在全局范围内:',垃圾邮件)
上面的输出是:
本地分配后:测试垃圾邮件
非本地分配后:非本地垃圾邮件
全局分配后:非本地垃圾邮件
在全局范围内:全局垃圾邮件
总结
以上是边肖介绍的Python中全局和非局部用法的详细说明。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!
如果你觉得这篇文章对你有帮助,请转载,请注明出处,谢谢!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。