一: 概念
我们给存放名字和值的关系的空间起一个名字叫命名空间. 我们的变量在存储的时候就是存储在这片空间中的.
详细解释:
在python解释器开始执行之后, 就会在内存中开辟一个空间, 每当遇到一个变量的时候, 就把变量名和值之间的关系记录下来, 但是当遇到函数定义的时候, 解释器只是把函数名读入内存, 表示这个函数存在了, 至于函数内部的变量和逻辑, 解释器是不关心的. 也就 是说一开始的时候函数只是加载进来, 仅此而已, 只有当函数被调用和访问的时候, 解释器才会根据函数内部声明的变量来进行开辟变量的内部空间. 随着函数执行完毕, 这些函数内部变量占用的空间也会随着函数执行完毕而被清空.
二: 分类
1.全局命名空间 : 我们直接在py文件中,函数外声明的变量都属于全局命名空间
2. 局部命名空间 : 在函数中声明的变量会存放在局部命名空间
3. 内置命名空间 : 用于存放python解释器为我们提供的名字,比如list,tuple,str,int等
三 : 顺序
加载顺序: 内置命名空间 > 全局命名空间 > 局部命名空间(函数被执行的时候)
取值顺序: 局部命名空间 > 全局命名空间 > 内置命名空间
a = 10 def func(): a = 20 print(a) func() # 20
四 : 作用域
也叫作用范围,按照生效范围可以分为全局作用域和局部作用域
全局作用域 : 包含内置命名空间和全局命名空间,在整个文件的任何位置都可以使用(遵循从上到下逐行执行)
局部作用域 : 在函数内部使用
可以使用globs()函数查看全局作用域中的内容,使用locas()函数查看局部作用域中的变量和函数信息
a = 10 def func(): a = 40 b = 20 def abc(): print("哈哈") print(a, b) # 这里使用的是局部作用域 print(globals()) # 打印全局作用域中的内容 print(locals()) # 打印局部作用域中的内容 func()
五 : 两个关键字global和nonlocal
首先我们写这样一个代码,首先在全局声明一个变量,然后在局部调用这个变量,并改变它的值
a = 100 def func(): global a # 加了个global表示不不在局部创建这个变量了. 而是直接使用全局的a a = 28 print(a) func() print(a)
global表示,不再使用局部作用域中的变量了,改用全局的变量
lst = ["麻花藤", "刘嘉玲", "詹姆斯"] def func(): lst.append("⻢马云云") # 对于可变数据类型可以直接进行访问. 但是不能改地址. 说白了. 不能赋值 print(lst) func() print(lst)
nonlocal表示在局部作用域中,调用父级命名空间中的变量
a = 10 def func1(): a = 20 def func2(): nonlocal a a = 30 print(a) func2() print(a) func1() 结果: 加了nonlocal 30 30 不加nonlocal 30 20