一、命名空间(有三种)
1.内置的命名空间 -----python解释器
就是python解释器一启动就可以使用的名字存储再内置的命名空间中
内置的名字在启动解释器的时候被加载进内存里。
2.全局命名空间 -----我们写的代码,但不是函数中的代码
是在程序从上到下被执行的过程中依次加载进内存的
放置了我们设置的所有变量名和函数名
3.局部命名空间 -----函数
就是函数内部定义的名字
当调用函数的时候,才会产生这个名称空间,随着函数执行的结束,这个命名空间就又消失了
三种命名空间之间的加载顺序:
内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
#在局部:可以使用全局、内置命名空间中的名字
#在全局:可以使用内置命名空间中的名字,但是不能用局部中命名空间中的名字
#在内置:不能使用全局、局部命名空间中的名字
def func(): a = 1 func() print(a) #因为全局没有a这个变量,它不可能去找func函数里的这个a变量,所以会报错
#在正常情况下,直接使用内置的名字
#当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字
#当我自己有的时候,我就不找我的上级要了
#如果自己没有,就找上一级要,上一级没有再找上一级,如果内置的名字空间都没有,就报错
#多个函数应该拥有多个独立的局部命名空间,不互相共享
def input(): print(‘in input now‘) def func(): # input = 1 print(input) func() # <function input at 0x0000028967220378> ---函数的内存地址() #func ---> 函数的内存地址 #函数名() --->函数的调用 #函数的内存地址() --->函数的调用
二、作用域
#全局作用域 ---作用在全局 ---内置和全局名字空间中的名字都属于全局作用域---globals()
#局部作用域 --- 作用在局部 --- 函数(局部名字空间中的名字属于局部作用域)---locals可以查看
a = 1 def func(): return a print(func()) # 1 a = 1 def func(): global a a += 1 func() print(a) #2 func() print(a) #3 a = 1 def func(a): a = 2 return a a = func(a) print(a) #2
#对于不可变数据类型,在局部可以查看全局作用域中的变量,但是不能直接修改
#如果想要修改,需要在程序的一开始添加global声明
#如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局变量有效
a = 1 b = 2 def func(): x = ‘aaa‘ y = ‘bbb‘ print(locals()) # {‘x‘: ‘aaa‘, ‘y‘: ‘bbb‘} print(globals()) func() print(globals()) print(locals()) #本地的,放在全局,全局就是本地;放在局部,局部就是本地
#globals 永远打印全局的名字
#locals 输出什么,根据locals所在的位置