名称空间
名称空间的概念
即存放名字与对象映射/绑定关系的地方。
名称空间的分类
-
内置名称空间:伴随python解释器的启动(关闭)而创建(回收)。
len() print() open() # len、print、open都存放于内置名称空间中
-
全局名称空间:伴随python文件的执行开始(执行结束)而产生(回收)。一般情况下,在python文件中顶格写的变量都存放于全局名称空间中。
PS:通过globals()方法来查看全局名称空间中的变量
name = 'mark' def func(): pass a = [11, 22, 33] for i in a: print(i) print(i) while True: x = 123 break # name、a、func、i、x都在全局名称空间中
-
局部名称空间:伴随函数的调用(结束)而临时产生(回收),函数的形参以及在函数内定义的变量名都会存在于局部名称空间中。
PS:通过locals()方法来查看局部名称空间中的变量
def index(a, b, c): x = 222 y = 111 # 查看局部的名称空间 print(locals()) # 调用 index(1, 2, 3) # a、b、c、x、y都存在于局部名称空间中 注意:函数调用后才会产生
名字的查找顺序
名称空间的加载顺序:内置名称空间 > 全局名称空间 > 局部名称空间
前提条件:先知道自己位置在哪里
- 如果在全局,则查找顺序为:全局名称空间 > 内置名称空间
- 如果在局部,则查找顺序为:局部名称空间 > 全局名称空间 > 内置名称空间
名称空间的作用域
即为名称空间所作用的范围。
- 内置名称空间作用域:全局有效(在任意位置可用)
- 全局名称空间作用域:全局有效(在任意位置可用)
- 局部名称空间作用域:局部有效(只能在函数内部使用)
global和nonlocal关键字的使用
-
global关键字:用来在局部修改全局变量
# 练习1: x = 111 def index(): # 局部修改全局的变量 global x x = 222 index() print(x) # x = 222 # 练习2: list1 = [11, 22] def index(): # 局部修改全局的变量 list1.append(33) index() print(list1) # [11,22,33]
注意:
- 修改的变量是不可变的类型,需要global关键字声明
- 修改的变量是可变的类型,不需要global关键字声明
-
nonlocal关键字:用来在内部的局部修改外部的局部变量
def index(): x = 222 list1 = [1, 2, 3] def func(): # 内部的局部修改外部的局部的变量 nonlocal x x = 333 list1.append(4) func() print(list1) index()
注意:
- 修改的外部局部变量是不可变的类型,需要nonlocal关键字声明
- 修改的外部局部变量是可变的类型,不需要global关键字声明