python作用域和名称空间

名称空间管理名称到对象的映射,目前在python中名称空间多以字典的形式实现,但我们不应该这样记忆,因为在以后的版本中可能会更改实现方式。名称空间的例子有:
built-in names, the global names in a module, the local names in a function invocation. In a sense the set of attributes of an object also form a namespace. 
不同名称空间内的名字没有任何关系。
任何以点号访问的名字,我们都可以称之为attribute。严格地说,模块内的名字就是模块的属性,模块内定义的全局变量和模块本身的属性拥有相同的名称空间。

名称空间在不同的时间构造,而且拥有不同的生命周期。
built-in名称空间在python解释器启动的时候生成,而且永远不会被删除。

函数的局部名称空间在函数调用的时候生成,当函数返回或抛异常时删除,每次递归都会生成新的名称空间。

作用域是指能直接访问名称空间的python文法块。直接访问的意思是不通过全限定名来访问。

nonlocal 最近的外层
global 模块的全局
这两个关键字是关于重绑定的,与读无关,只与赋值有关

在Python中,确实只有在执行def和class语句的时候会产生新的作用域,至少根据我现在对Python源码的认识是这样的。而if,try,for等语句的执行不会产生新的作用域。
原文地址:https://www.cnblogs.com/zhujianxipan/p/3146860.html