目录
一、命名空间
1.命名空间的本质
2.命名空间的种类
3.访问命名空间中的内容
4.命名空间的加载顺序
5.命名空间的查找顺序
二、作用域
1.作用域指的是:
2.根据变量声明的位置不同,作用域可以分为4类:
3.变量的搜索顺序
三、全局变量和局部变量
四、global和nonlocal关键字
1.glocal关键字
2.nonlocal关键字
五、命名空间与作用域的关系
一、命名空间
1.命名空间的本质
Python的命名空间的本质是一个字典,用来记录变量名称和值。
2.命名空间的种类
局部命名空间 | 记录的是参数以及在函数体中声明的变量名和值 |
全局命名空间 | 记录的是整个py文件中的变量和函数 |
内置命名空间 | 记录的是内置函数 eg:print() id() .................... |
注意:func()得本质就是内存地址调用方法
函数名本质就是内存地址
3.访问命名空间中的内容
locals() | 使用locals()内置函数来查看局部命名空间中的内容 |
globals() | 使用globals()内置函数来查看全局命名空间中的内容 |
**注意事项:
如果locals()没有在函数体中,而是在py文件中,打印出来的内容和glocals()打印出来的内容相同
'''
1.使用locals()内置函数来查看局部命名空间种的内容
2.使用globals()内置函数来查看全局命名空间中的内容
注意:
如果locals()没有在函数体中,而是在py文件中,
打印出来的内容和globals()相同
'''
d = 30
def func(c):
a = 10
b = 20
print(locals()) # {'b': 20, 'a': 10, 'c': 30}
func(30)
print(globals())
print(locals())
# {'__name__': '__main__', '__doc__': '\n\n1.使用locals()内置函数来查看局部命名空间种的内容\n2.使用globals()内置函数来查看全局命名空间中的内容\n注意:\n如果locals()没有在函数体中,而是在py文件中,\n打印出来的内容和globals()相同\n', '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000001DBD0B8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/python/day09/demo02_访问命名空间中的内容.py', '__cached__': None, 'd': 30, 'func': <function func at 0x0000000001E2F730>}
4.命名空间的加载顺序
内置命名空间>全局命名空间>局部命名空间
5.命名空间的查找顺序
(1)局部命名空间------>全局聚命名空间---->内置命名空间
(2)如果一开始就是从全局命名空间中查找------->全局命名空间------->内置命名空间
找到就返回内容,找不到就报错
注意:自己的变量名不要和内置的函数名相同,否则无法使用命名空间中的内容
二、作用域
1.作用域指的是:
变量的可用范围
2.根据变量声明的位置不同,作用域可以分为4类:
局部作用域 | 函数体中声明的变量 |
嵌套作用域 | 嵌套函数中外层函数体中声明的变量 |
全局作用域 | py文件中声明的变量 |
内置作用域 | Python提供的变量或函数 |
3.变量的搜索顺序
先从当前作用域开始,如果找到则停止搜索,如果找不到就往上一层作用域中查找
以此类推,如果找不到就报错
三、全局变量和局部变量
全局变量 | 不可变数据类型 int float str tuple............... | 函数无法修改全局变量的值 |
可变类型数据类型 list dict set.............. | 函数可以修改全局变量的值 |
四、global和nonlocal关键字
glocal | 可以将局部变量变成一个全局变量 |
nonlocal | 可以修改外层(非全局)变量 |
1.glocal关键字
2.nonlocal关键字
五、命名空间与作用域的关系
命名空间 | 定义了在某个作用域内的变量名和绑定值之间的对应关系 |
作用域 | 定义了命名空间中的变量能够在多大的范围内起作用 |