【一】名称空间
【1】什么是名称空间
名称空间就是存放函数名与函数值对应关系的地方
变量名=变量值
用变量名 和 变量值进行绑定 ---> 名称空间
名称空间即存放名字与对象映射/绑定关系的地方
【2】名称空间
[1]内建名称空间
- 在Python解释器中自带的名称空间会随着代码启动而生成,随着代码结束而关闭
[2]全局名称空间
- 随着内建名称空间加载完成自己创建的变量名 / 函数名 / 类名
列表是可变数据类型 ---> 列表被修改后id不变
num_list = []
print(id(num_list)) # 1200291395392
def add_list(num):
num_list.append(num)
print(id(num_list)) # 1200291395392
add_list(1)
add_list(2)
add_list(3)
print(num_list) # [1, 2, 3]
print(id(num_list)) # 1200291395392
[3]局部名称空间
- 在函数内部或者是类内部定义的变量随着函数启动而创建,随着函数结束而消失
- 伴随函数的调用/结束而临时产生/回收,函数的形参、函数内定义的名字都会被存放于该名称空间中
def add_list(num):
# 垃圾回收机制 ---> 节省内存开销
num_list = []
num_list.append(num)
print(num_list)
print(id(num_list)) # 1200291395392
add_list(1)
add_list(2)
add_list(3)
【3】名称空间的加载顺序
- 先加载内建名称空间
- 其次是全局名称空间
- 最后就是局部名称空间
【4】名称空间的查找顺序
- 如果你在全局查 先全局后内建 --> 在 py 文件中执行代码
- 如果在局部 先局部再全局再内建 ---> 在函数内部执行代码
- 所有的变量 尤其是 可变数据类型 字典 列表 尽量写在文件开头 如果放在函数下面可能会导致检索不到变量
【二】作用域
【1】变量作用域
-
变量的作用域
- Python是静态作用域,也就是说Python中,变量的作用域源于它在代码中的位置
- 在不同的位置,可能有不同的命名空间。命名空间是变量作用域的体现形式
-
python变量作用域一般有4种:
- Local(局部变量)
- Enclosed(嵌套)
- Global(全局)
- Built-in(内置)
[1]Local 局部变量
- Local(局部变量):暂时的存在,依赖于创建该局部作用域的函数。函数存,则局部变量存,函数亡,则局部变量亡
- 作用范围:当前整个函数体范围
# 定义一个函数,函数内部就是局部作用域
def fun():
# 只有在函数内部的变量
b = 2
print(b) # 输出2
fun()
# 调用函数后,发现找不到变量 b 是因为在全局作用域中找不到 变量 b
print(b) # 报错
'''
Traceback (most recent call last):
File "E:\PythonProjects\def_func.py", line 16, in <module>
print(b) # 报错
NameError: name 'b' is not defined
'''
[2]Enclosed 嵌套
- Enclosed(嵌套):一般是在函数中嵌套函数的时候,外层函数的变量作用域。
- 作用范围:闭包函数
# Enclosed(嵌套)作用域
def fun1():
b = 2
print("这是fun1打印的:", b)
def fun2():
# 函数 func1 里面 嵌套的 函数 func2 里面的作用域就是 嵌套作用域
print("这是fun2打印的:", b)
# 将内部函数 func2 的内存地址返回
return fun2
# 调用 函数 fun1 , 函数 func1 的返回值是内部函数 fuc2的函数地址
temp = fun1()
# 调用 函数 fun1 的返回值(fuc2的函数地址) , 从而执行 函数 fuc2
temp()
# 这是fun1打印的: 2
# 这是fun2打印的: 2
[3]Global 全局
- Global(全局):一般模块文件顶层声明的变量具有全局作用域,从外部来看,模
块的全局变量就是一个模块对象的属性,仅限于单个模块文件中。 - 作用范围:当前模块(文件)
# Global(全局)作用域
# 定义在全局的变量,在本文件任意位置可调用该变量
a = 2
def fun1():
print("这是fun1打印的:", a)
fun1()
print(a)
# 这是fun1打印的: 2
# 2
[4]Built-in 内置
- Built-in(内置):解释器内置的变量,比如int, str等。
- 作用范围:所有模块(文件)
- Python中没有块级作用域。
- 块级作用域:代码块中的变量,比如if、while、for后面的代码
【2】LEGB规则
按照L--->E--->G--->B的顺序查找变量
[1]基于命名空间的常见变量类型
- 局部变量:
- 在一个函数体的内部定义的变量
- 作用域为函数内部
- 查看局部变量命令:locals()
- 全局变量
- 在函数体外部,文件最外层定义的变量
- 作用域为整个文件内部
- 查看全局变量命令:globals()