LEGB:L :即locals、当前存在的命名空间(函数或者模块)、函数自变量也属于命名空间内的变量
e :即enclosing function,外部嵌套函数的命名空间
g :即全局变量
b :是嵌入式模块的命名空间,所有这些嵌入式模块都位于__builtin__中
变量检索的优先顺序:局部作用域(l )嵌套作用域(e )全局作用域(g )内建作用域(b ) )。
让我们看一个例子
1:city='政府周'
定义类别名称(: )
city='shanghai '
打印站点
cityname () )
打印站点
点击。 上海
正州
描述:由于模块中的值为zhengquous的city变量是全局变量,函数cityname中的city变量是局部变量,因此根据范围搜索顺序,函数中的print语句中的city值必须位于cityname函数内部的city中函数饥饿的print语句的city是模块中的全局变量
2 )上例中的函数内部赋值如何更改外部作用域中同名变量的值city='zhengzhou '
定义类别名称(: )
环球城
city='shanghai '
打印站点
cityname () )
打印站点
点击。 上海
上海
说明:此处使用关键字global将函数内部的city变量声明为全局变量。 这样,就可以在函数内部的范围内更改全局变量
关键字非本地。
在python2中,闭包只能读取外部函数的变量,不能重写。 为了解决这个问题,python3引入了nonlocal关键字,通过在闭包中用nonlocal声明变量,解释器现在可以在外部函数中查找变量名称。 nonlocal与global相似。 nonlocal关键字允许在嵌套函数中更改嵌套范围def cityname () ) :
city='正州'
定义类别名称(: )
nonlocal name
city='shanghai '
Cityname () )
是打印(city )
cityname () )
点击。 上海
关键词global和nonlocal的区别:
1 :功能不同。 global关键字限定变量后,表示该变量为全局变量,更改后全局变量也会更改。 另一方面,nonlocal杆自限定变量是上级函数的局部变量,如果上级函数中不存在该局部变量,则在nonlocal位置会出现错误
2 :范围不同。 可以在任何地方使用global关键字,包括顶层函数和嵌套函数。 即使有以前未定义的更改,global也可以经过限定并直接使用,但nonlocal关键字只能在嵌套函数中使用,函数中定义了相应的局部变量。 如果未定义,则会发生错误