4分钟让你明白python的变量作用域(scope)与名字空间(namespace)

python作用域是以函数、类、模块来区分的,而不是

也就是说ifwhilefor并不会影响变量的作用域!!!,python中没有块作用域。

这就能解释python的if __name__=='__mian__'中声明的变量同样是全局变量

print(g)
if __name__=='__main__':
    g='global'
#输出为:global

python 作用域的优先级:LEGB

LEGB 表示的是 Local, Enclosing, Global, and Built-in 。同名变量优先访问局部变量,其次是闭包变量,其次是全局变量,最后才是内置变量。

作用域转换:关键字globalnolocal(嵌套函数中使用)

python 变量的解析顺序 :LEGB

  1. L:先在局部变量中找,如果找不到
  2. E:则去闭包变量中找,如果找不到
  3. G:则去局部变量中找,如果找不到
  4. 去内置变量中找,如果找不到,才报错
image-20200521135909324

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

原文地址:https://www.cnblogs.com/justisme/p/12930416.html