Python进阶02 作用域
一、作用域
作用域针对变量而言,指申明了变量在程序里的可应用范围。
只有函数,类,模块会产生作用域,代码块不会产生作用域。例如for循环,if判断都不产生作用域。
二、作用域链
Python中作用域链,变量会由内到外去找,先去自己的作用域找,自己没有在去上级去找,一直到找不到报错。
特性:函数未执行之前,作用域已经形成,作用域链也生成了。
name = "lzl" def f1(): print(name) def f2(): name = "eric" f1()
f2()
结果:
lzl
这里有解释:
在f2中执行f1时,f1的作用域链已经形成,向上级找,name为lzl。
三、全局变量和局部变量
全局变量:所有函数之外定义的变量。
局部变量:函数内部定义的变量或者类,模块里的变量。
函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义了一个局部变量,不管全局域中有没有该变量名,函数中使用的将是局部变量。
(即声明了一个新的局部变量。如果这个变量名字和全部变量名字相同,那么局部变量名字会覆盖全局变量名字。)
a = 10 b = 20 def fun(): a = 1 b = 10 print('locals: ', locals()) fun() print('globals: ', globals()) 结果: locals: {'a': 1, 'b': 10} globals: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10a2f0080>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Volumes/DATA/python/python_test/test.py', '__cached__': None, 'a': 10, 'b': 20, 'fun': <function fun at 0x10a283268>}
四、在函数中使用全局变量(务必慎用全局变量)
如果只是读取全局变量不会有任何问题。
如果想重新关联全局变量,则需要借助关键字global。
_num = 100 def func(): global _num # 声明这个Num是全局。如果全局变量已经有这个Num变量那就是指的它 如果全局没这个Num那就新定义一个全局变量。 _num = 200 print(_num) func() print(_num) # 输出200 说明修改的就是全局变量
参考文章:
https://www.cnblogs.com/goldsunshine/p/10948475.html