名称空间
名称空间分为三种:
内建名称空间
全局名称空间
局部名称空间
内建名称空间
第一个被加载的名称空间,存储一些内置的名称
全局名称空间
第二个被加载的名称空间,文件执行过程中产生的变量名都会存放于全局名称空间
局部名称空间
函数的形参、函数内定义的名称都会存放在局部名称空间
作用域
全局作用域、局部作用域
全局作用域全局有效,在任意位置都可以使用
局部作用域只能在函数中使用
作用域查找的优先级
在局部作用域查找名字时,起始位置是局部作用域,所以先找局部名称空间,没有找到,再去全局作用域查找,先查找全局名称空间,没有找到,再去内置名称空间查找,最后都没有,就会抛出异常
x = 1 # 全局作用域的名字x def foo(): x = 2 # 局部作用域的名字x print(x) # 在局部找x foo() # 结果为2
在全局查找名字时,现在全局作用域查找,没有找到,再去内置名称空间查找,都没有找到,会抛出异常
x=100 def foo(): x=300 #在函数调用时产生局部作用域的名字x foo() print(x) #在全局找x,结果为100
如果要在函数内修改全局名称空间的变量值,并且这个全局的变量还是不可变类型时,可以用关键字global
x=1 def foo(): global x #声明x为全局名称空间的名字 x=2 foo() print(x) #结果为2
如果有多重嵌套的函数,想要修改非全局的变量时,要使用关键字nonlocal
def f1(): x=2 def f2(): nonlocal x x=3 f2() #调用f2(),修改f1作用域中名字x的值 print(x) #在f1作用域查看x f1() # 3