当前位置: 首页 > 后端技术 > Python

PythonGlobal和Nonlocal

时间:2023-03-25 19:43:37 Python

nonlocal和global的用法也很容易混淆。简单记录下你的理解。说明global一句话,作用域是全局的,即这个变量对应的地址的值会被修改。全局语句是适用于整个当前代码块的声明。这意味着列出的标识符将被解释为全局变量。虽然自由变量可以引用全局变量而不声明为全局变量。全局语句中列出的名称不得用于全局语句之前的文本块中。global语句中列出的名称不能定义为形式参数,也不能定义在for循环控制目标、类定义、函数定义、导入语句或变量注释中。当前的实现不强制执行这些限制,但程序不应该滥用这种自由,因为未来的实现可能会强制执行这些限制,或者悄悄地改变程序的含义。程序员注意:global是一个指向解析器的指令。它仅适用于与全局语句同时解析的代码。特别是,提供给内置exec()函数的字符串或代码对象中包含的全局语句不会影响包含函数调用的代码块,并且此类字符串中包含的代码不受函数中包含的代码的影响称呼。全局语句的效果。eval()和compile()函数也是如此。nonlocal只在闭包内部生效,作用域在闭包内部。外部和内部功能都会受到影响,但不会影响闭包之外。nonlocal语句导致列出的标识符引用最近的封闭范围内的先前绑定变量,而不是全局变量。这很重要,因为绑定的默认行为是首先搜索本地命名空间。此语句允许封装的代码重新绑定局部范围之外的变量,而不是全局(模块)范围。非局部语句中列出的名称与全局语句中列出的名称不同,它们必须引用封闭范围中已经存在的绑定(无法明确确定应在其中创建新绑定的范围)。不使用非本地和globalx=0defouter()的示例:x=1definner():x=2print("inner:",x)inner()print("outer:",x)outer()print("global:",x)#inner:2#outer:1#global:0nonlocalscopex=0defouter():x=1definner():nonlocalxx=2print("inner:",x)inner()print("outer:",x)outer()print("global:",x)#inner:2#outer:2#global:0globalscopex=0defouter():x=1definner():globalxx=2print("inner:",x)inner()print("outer:",x)outer()print("global:",x)#inner:2#outer:1#global:2注意如果局部变量声明为全局变量,则不能再次声明为非局部变量x=0defouter():globalxx=1definner():nonlocalxx=2print("inner:",x)inner()print("outer:",x)outer()print("global:",x)#SyntaxError:nobindingfornonlocal'x'foundThevariablexneedsbeinginitializedbeforeusingnonlocal=0defouter():definner():nonlocalxx=2print("inner:",x)inner()print("outer:",x)outer()print("global:",x)#SyntaxError:nobindingfornonlocal'x'found无法在函数的外部函数中声明nonlocalx=0defouter():x=1nonlocalxdefinner():x=2print("inner:",x)inner()print("outer:",x)outer()print("global:",x)#SyntaxError:name'x'isassignedtobeforenonlocaldeclaration有兴趣的可以关注公众号「chasays」-程序员聚集地