python进阶之 ——名称空间与作用域
一、名称空间namespace:存放 名字与值内存地址绑定关系 的地方
1.内置名称空间(Built-in):存放python自带的名称与值的绑定体,len、 print、 sum等内置方法的名字,注意关键字比如if、while...不存放在其中
产生:在python解释器启动时创建
销毁:python解释器退出时关闭
2.全局名称空间(Global):当打开一个文件然后执行时,全局名称空间记录了文件中定义的变量,包括此文件中定义的函数、类、其他导入的模块、模块级的变量与常量。
产生:在.py文件被加载时创建,通常一直保留直到文件执行结束
销毁:python解释器执行python程序完毕后退出销毁
3.局部名称空间(Local):每个函数所拥有的命名空间,记录了函数中定义的所有变量,包括函数的参数、内部定义的局部变量。
产生:在函数被调用时才被创建
销毁:但函数返回结果或抛出异常时被删除。(每一个递归函数都拥有自己的命名空间)。
如果函数多层嵌套,介于全局和局部间,还有当前所在层函数的名称空间,比如函数嵌套定义时,putin()函数有自己的名称空间,也可以看作局部名称空间,只不过
它的子函数close_door()还有自己的局部名称空间(Local),即,局部是相对的。
名称空间的加载顺序:内置======》全局======》局部
名称空间的访问顺序:局部===逐层往上===》全局====》内置
二、作用域:名称空间的作用范围
Global广义化为—— 全局+内置名称空间
Local—— 局部名称空间。可以用 print(global()) 和在局部用print(local()) 查看当前位置的作用域内都有哪些"名称”。
还可以用 global 变量名 的方式,将变量声明为全局变量。nonlocal 变量名,将会声明:之后在当前作用域使用这个变量,将会引用外层(优先上一层)变量,但引用不到全局。
函数的作用域在定义时就固定了,与之后调用函数的位置无关!!!!