函数的命名空间和作用域
一、命名空间
1.内置----python解释器
内置命名空间 —— python解释器
python解释器一启动就可以使用的名字存储在内置命名空间中,内置的名字在启动解释器的时候被加载进内存里
2.全局--自己写的代码
全局命名空间 —— 我们写的代码但不是函数中的代码
程序从上到下被执行的过程中依次加载进内存的,放置了我们设置的所有变量名和函数名
3.局部 — 函数
函数内部定义的名字,当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了
在局部:可以使用全局、内置命名空间中的名字
在全局:可以使用内置命名空间中的名字,但是不能用局部中使用
在内置:不能使用局部和全局的的
def func():
a = 1
func()
print(a) # 错误,不能使用局部变量
def max():
print('in max func')
print(max())
在正常情况下,直接使用内置的名字,当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字,当我自己有的时候就不会找上级要了,如果自己没有,就找上一级要,上一级没有再找上一级,如果内置的名字空间都没有,就报错。
#多个函数应该拥有多个独立的局部名字空间,不互相共享
def input():
print('in input now ')
def func():
#input = 1
input()
func()
#func --->函数的内存地址 (函数名代表的是函数的内存地址)
#函数名() 函数的调用
#函数的内存地址()函数的调用
二、作用域
1.全局作用域
-- 作用在全局 -- 内置和全局名字空间都属于全局作用域 global()
查看全局的变量
a = 1
def func():
global a # 使用global声明后,就可以修改全局变量
a = 2
func()
print(a)
2.局部作用域
-- 作用在局部 -- 函数(局部名字空间属于局部作用域) locals()
可以查看局部的变量
对于不可变数据类型 在局部可是查看全局作用域中的变量,但是不能直接修改,如果想要修改,需要在程序的一开始添加global声明,如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效。
a = 1
b = 2
def func():
x = 'aaa'
y = 'bbb'
print(locals())
func()
print(globals())
print(locals())
#globals 永远打印全局的名字
#locals 输出什么,根据locals所在的位置
a = 1
def func(a):
a = 2
return a
a = func(a)
print(a)
三、函数的嵌套定义
1.内部函数可以使用外部函数的变量
a = 1
def outer ():
a = 1
def inner():
b = 2
print(a)
print('inner')
def inner2():
nonlocal a #声明了一个上面第一层局部变量
#global a #声明了一个全局变量
a += 1 #不可变数据类型的修改
inner2()
inner()
print('**a**',a)
outer()
print('全局:',a)
nonlocal 只能用于局部变量 找上层中离当前函数最近一层的局部变量,声明了nonlocal的内部函数的变量,修改会影响到 离当前函数最近一层的局部变量,对全局无效,对局部 也只是对最近的一层 有影响。
func() #函数名就是内存地址
func2 = func #函数名可以赋值
func2()
l = [func,func2] #函数名可以作为容器类型的元素
print(l)
for i in l:
i()
def func():
print(123)
def wahaha(f):
f()
return f #函数名可以作为函数的返回值
qqxing = wahaha(func) #函数名可以作为函数的参数
qqxing()
浩瀚学海,虔诚分享!
自强不息,厚德载物。