python作用域是以函数、类、模块来区分的,而不是块
也就是说if
、while
,for
并不会影响变量的作用域!!!,python中没有块作用域。
这就能解释python的if __name__=='__mian__'
中声明的变量同样是全局变量
print(g)
if __name__=='__main__':
g='global'
#输出为:global
python 作用域的优先级:LEGB
LEGB 表示的是 Local, Enclosing, Global, and Built-in 。同名变量优先访问局部变量,其次是闭包变量,其次是全局变量,最后才是内置变量。
作用域转换:关键字global
与nolocal(嵌套函数中使用)
python 变量的解析顺序 :LEGB
- L:先在局部变量中找,如果找不到
- E:则去闭包变量中找,如果找不到
- G:则去局部变量中找,如果找不到
- 去内置变量中找,如果找不到,才报错
namespace
存储变量的地方,用字典实现。__dict__
来查看这些字典。
The place where a variable is stored.
import sys
print(sys.path)
#等价于如下命令
print(sys.__dict__['path'])
参考
1 . https://stackoverflow.com/questions/2829528/whats-the-scope-of-a-variable-initialized-in-an-if-statement。
2. https://www.datacamp.com/community/tutorials/scope-of-variables-python