Python--全局变量、局部变量、作用域
全局变量、局部变量、作用域
作用域
作用域简单说就是一个变量的命名空间。代码中变量被赋值的位置,就决定了哪些范围的对象可以访问这个变量,这个范围就是命名空间。python赋值时生成了变量名,当然作用域也包括在内。
一个全局变量的命名空间是这个模板,一个局部变量的命名空间是一个局部。
LEGB规则
locals->enclosing function -> globals -> builtins
locals:表示在在当前本地的命名空间中进行查找,
enclosing:表示当前函数的外部函数的本地命名空间
globals:表示全局变量
builtions:表示系统自动加载的变量
查找变量,首先在locals中进行查找,然后enclosing,再然后globals,接着最后在builtins中进行查找,如果在某一级中先找到,则停止向下查找,如果都没找到,则报错。(提示:函数名也是变量)
全局变量
定义在模板的最外层或者if name == "main"的变量,被称之为全局变量。
全局变量不仅可以在函数体外部被访问到,而且函数体内部也可以查找的到。
#!encoding=utf-8 a = [1, 2] def test(): a.append(456) print(a) test1() def test1(): print("test1") if __name__ == '__main__': print(a) test() print(a)
输出为:
[1, 2] [1, 2, 456] test1 [1, 2, 456]
使用global关键字修饰的变量,表示在LEGB规则的global等级开始查找该变量,如果没找到,则报错,也就是说,使用global修饰的变量,必须在再全局中及其以下的等级中定义定义。global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用。
#!encoding=utf-8 a = [1, 2] def test(): global print #builtin 等级的变量 global a #global 等级的变量 a.append(456) print(a) test1() def test1(): print("test1") if __name__ == '__main__': print(a) test() print(a)
输出结果为:
[1, 2] [1, 2, 456] test1 [1, 2, 456]
使用globals([Namespace])函数,可以查看所有指定命名空间内的全部全局变量。不指定参数,则默认为当前的模板。
局部变量
没有定义为全局变量的变量与没有使用global声明的变量统称为局部变量。局部变量的作用域是函数体的内部,在外部不可用。
如:
#!encoding=utf-8 a = [1, 2] def test(): b= [1,2] b.append(456) print(a) test1() print(globals()) print(locals()) if __name__ == '__main__': print(b) test()
输出结果为:
使用locals([Namespace])函数,可以查看所有指定命名空间内的全部局部变量。不指定参数,则默认为当前的命名空间。
#!encoding=utf-8 a = [1, 2] def test(): b= [1,2] b.append(456) print(locals()) if __name__ == '__main__': test()
输出结果为:
{'b': [1, 2, 456]}
nonlocal 可以用来修饰变量,nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。nonlocal关键字只能用于嵌套函数中,而且只有python3中有,并且外层函数中定义了相应的局部变量,否则会发生错误(见第一)。
#!encoding=utf-8 a = 3 def test(): b = 100 def test1(): nonlocal b #省去这一行则报错 b = b + 1 print(b) return test1 if __name__ == '__main__': ret = test() ret()
输出结果为:
101
重点来了:
使用非当前作用域的变量的而且未使用global或者nonlocal时候,当变量是不可变类型的时候,使用的时候不可以修改引用的变量的值。(如:整形,字符串),可变类型的数据,(如:列表、字典、集合、类),在引用的时候可以修改引用的变量的值。
#!encoding=utf-8 a = [1,2] b =3 c= 4 def test(): a.append(3) print(a) global b b=b+1 print(b) c=c+1 if __name__ == '__main__': test()
输出结果为:
#!encoding=utf-8 def test(): a = [1, 2] b = 3 c=4 def test1(): a.append(3) print(a) nonlocal b b = b + 1 print(b) c = c+1 return test1 if __name__ == '__main__': ret = test() ret()
输出结果为:
- Python笔记(2):多参数,全局变量与局部变量,层状作用域,函数式编程,面向对象
- Python中变量作用域问题——局部变量与全局变量
- 生命周期,作用域的定义;说明全局变量、静态变量、局部变量、const变量的生命周期、作用域
- 关于python中的局部变量和全局变量
- Python7--局部变量、全局变量、缺省参数、不定长参数、递归
- python函数全局变量和局部变量
- static作用(修饰函数、局部变量、全局变量)
- python中全局变量、局部变量、类变量、实例变量简析
- Python语法基础——关于全局变量与局部变量
- python中的局部变量和全局变量
- 「python」局部变量与全局变量
- static作用(修饰函数、局部变量、全局变量)
- 作用域、局部变量、全局变量
- Python 语言及其应用 Chapter_4_Note_5 全局变量和局部变量
- python中的全局变量与局部变量
- Python 全局变量 局部变量
- Python新手学习基础之函数-全局变量和局部变量
- Python新手学习基础之函数-全局变量和局部变量
- 汇编语言中可以定义变量吗?怎么定义?有局部变量和全局变量之分吗?作用域是什么?
- 兄弟连学Python(5)—局部变量和全局变量