python-17-命名空间和作用域
前言
命名空间:既是我们平时在写python中写的代码变量/函数/类等命名,有时候你发现命名不能重复或者出现冲突这些都关系着命名空间。
作用域:可以直接访问命名空间的正文区域,从内到外依次访问所有的作用域直到找到,找不到咋办?报错呗,说白了就是这个命名我去哪里找到你呢。
一。命名空间
python 中避免命名冲突的一种方法,各个独立,没有任何关系,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。
命名空间有三种:
1.内置命名空间:
①就是python解释器一启动就可以使用的名字存储在内置命名空间中
②内置的名字在启动解释器的时候被加载进内存里
③在内置:不能使用局部和全局的名字的
2.全局命名空间:
①是在程序从上到下被执行的过程中依次加载进内存的
②放置了我们设置的所有变量名和函数名
③在全局:可以使用内置命名空间中的名字,但是不能用局部中使用
3.局部命名空间:
①函数内部定义的名字
②当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了
③在局部:可以使用全局、内置命名空间中的名字
下面搞两个例子:
1.先找内部命名空间:
# 在全局定义和内置命名同名时,会使用全局的名字
# 即自己有先用自己的,没找到再往一层找,类推最后内置空间也没有就报错。
def input():
print('你瞎搞!!!')
def func(input):
input() # 我调用函数 input
input = 22 # 打印 input 就是先找到我
print(input)
func(input)
2.内部没有就找全局的:
# 在全局定义和内置命名同名时,会使用全局的名字
# 即自己有先用自己的,没找到再往一层找,类推最后内置空间也没有就报错。
def input():
print('你瞎搞!!!')
def func():
return input
func()()
二。作用域
作用域两种:
1.全局作用域 —— 作用在全局 —— 内置和全局名字空间中的名字都属于全局作用域 ——globals()——只打印全局的名字
2.局部作用域 —— 作用在局部 —— 函数(局部名字空间中的名字属于局部作用域) ——locals()——只打印局部的名字
nonlocal:只能用于局部变量(对全局无效),声明一个上层,最近的函数局部变量能进行所有操作。
# 不可变数据类型 在局部可查看全局作用域中的变量,但是不能直接修改。
# 如果要修改,需在程序的开始声明:global
# 在局部(函数)内声明了global 变量,则在局部中的变量所有操作将对对全局有效。
a = 0
def func():
global a # 声明:global a,即可以操作,未声明会报错
a += 10
b = 222
print('局部作用域:', locals()) # 查看局部空间作用域
print('全局作用域:', globals()) # 查看全局空间作用域
print('声明前:', a) # 未调用声明函数前
func()
print('声明后', a) # 调用声明的函数后
欢迎来QQ交流群一起学习:482713805