Python中 Global和Nonlocal的用法详解
nonlocal和global也很容易混淆。简单记录下自己的理解。
解释
global
总之一句话,作用域是全局的,就是会修改这个变量对应地址的值。
global语句是一个声明,它适用于整个当前代码块。这意味着列出的标识符将被解释为全局变量。尽管自由变量可能指的是全局变量而不被声明为全局变量。
global语句中列出的名称不得用于该全局语句之前的文本代码块中。
global语句中列出的名称不能定义为形式参数,也不能在for循环控制目标、class定义、函数定义、import语句或变量注释中定义。
当前的实现并不强制执行这些限制,但是程序不应该滥用这种自由,因为未来的实现可能会强制执行这些限制,或者悄悄地改变程序的含义。
程序员注意:global是指向解析器的指令。它仅适用于与全局语句同时解析的代码。特别是,包含在提供给内置exec()函数的字符串或代码对象中的全局语句不会影响包含函数调用的代码块,而且这种字符串中包含的代码不会受包含函数调用的代码中的全局语句的影响。eval()和compile()函数也是如此。
一、global
1、global关键字用来在函数或其他局部作用域中使用全局变量。但是如果不修改全局变量也可以不使用global关键字。
gcount=0 defglobal_test(): gcount+=1 print(gcount) global_test()
以上代码会报错:第一行定义了全局变量,在内部函数中又对外部函数进行了引用并修改,那么python会认为它是一个局部变量,有因为内部函数没有对其gcount进行定义和赋值,所以报错。
2、如果局部要对全局变量修改,则在局部声明该全局变量
gcount=0 defglobal_test(): globalgcount gcount+=1 print(gcount) global_test()
以上输出为:1
3、如果局部不声明全局变量,并且不修改全局变量,则可以正常使用
gcount=0 defglobal_test(): print(gcount) global_test()
以上输出为:0
二、nonlocal
nonlocal
只在闭包里面生效,作用域就是闭包里面的,外函数和内函数都影响,但是闭包外面不影响。
nonlocal语句使列出的标识符引用除global变量外最近的封闭范围中的以前绑定的变量。这很重要,因为绑定的默认行为是首先搜索本地名称空间。该语句允许封装的代码将变量重新绑定到除全局(模块)作用域之外的本地作用域之外。
nonlocal语句中列出的名称与global语句中列出的名称不同,它们必须引用封闭范围中已经存在的绑定(无法明确确定应在其中创建新绑定的范围)。
1、nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
defmake_counter(): count=0 defcounter(): nonlocalcount count+=1 returncount returncounter defmake_counter_test(): mc=make_counter() print(mc()) print(mc()) print(mc()) make_counter_test()
以上输出为:
1
2
3
三、混合使用
defscope_test(): defdo_local(): spam="localspam"#此函数定义了另外的一个spam字符串变量,并且生命周期只在此函数内。此处的spam和外层的spam是两个变量,如果写出spam=spam+“localspam”会报错 defdo_nonlocal(): nonlocalspam#使用外层的spam变量 spam="nonlocalspam" defdo_global(): globalspam spam="globalspam" spam="testspam" do_local() print("Afterlocalassignmane:",spam) do_nonlocal() print("Afternonlocalassignment:",spam) do_global() print("Afterglobalassignment:",spam) scope_test() print("Inglobalscope:",spam)
以上输出为:
Afterlocalassignmane:testspam
Afternonlocalassignment:nonlocalspam
Afterglobalassignment:nonlocalspam
Inglobalscope:globalspam
总结
以上所述是小编给大家介绍的Python中Global和Nonlocal的用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。