python 名称空间和作用域
目录
名称空间
名称空间分类
生命周期
名称空间内的查找顺序
作用域
名称空间
名称空间:名称空间即存放名字与对象映射/绑定关系的地方.
列如:对于x=3,Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中,del x表示清除该绑定关系。
访问变量值:想访问一个变量的值,就必须到名称空间去找,找到后才能访问变量名的值
名称空间的分类
内置名称空间:python解释器中定义好的名字
例如:
len() max() min()
全家名称空间:
伴随python文件的开始执行,执行完毕而产生/回收,是第二批被加载的名称空间,文件执行过程中产生的名字都会存放于该名称空间中,如下名字
import sys #模块名sys x=1 #变量名x if x == 1: y=2 #变量名y def foo(x): #函数名foo y=1 def bar(): pass Class Bar: #类名Bar pass
局部名称空间: 函数内部所创建的变量名都属于局部名称空间
def index(): x = 1
生命周期
内置名称空间:Python解释器启动就立马创建,关闭解释器名称空间销毁
全局名称空间:运行.py文件创建,.py文件程序运行结束语自动销毁
局部名称空间:函数被调用时创建, 函数执行结束销毁
名称空间的寻找
len = "全局名称空间" def func():’】= len = '局部名称空间' print(len) print(len) # 全局名称空间 # 注释掉len = "全局名称空间",得到<built-in function len>
总结:
1.必须先确定你当前所在位置(前提) 1.站在全局:全局-->内置 2.站在局部:局部-->全局-->内置
2.函数在定义阶段查找名字的顺序就已经固定了, 不会因为函数的调用位置变化而变化.
作用域
按照名称空间作用范围的不同,可以把其分为两个区域:
全局作用域:位于全局名称空间、内置名称空间的名字,名字全局作用域。
局部作用域:位于局部名称空间的名字,名字作用域局部
案例
1. global 局部变量修改全局变量(不可变类型)
x = 1 name = 'jason' def func(): global x, name x = 2 name = 'egon' func() print(x) print(name)
2.nonlocal 局部变量修改局部变量
def func(): x = 2 def index(): nonlocal x x = 3 index() print(x) func()