python globals()和locals(),global和nonlocal,以及闭包
Posted pengdachui-1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python globals()和locals(),global和nonlocal,以及闭包相关的知识,希望对你有一定的参考价值。
1. 命名空间和作用域
命名空间
1. 内置命名空间: python解释内部运行时的变量函数
2. 全局命名空间: 我们在py文件中直接声明出来的变量, 函数
3. 局部命名空间: 在函数内部声明的变量和函数
作用域:
1. 全局作用域: 内置 + 全局
2. 局部作用域: 局部
globals() 查看全局作用域中的名字
locals() 查看当前作用域中的名字
2. global和nonlocal
global: 把全局变量拿到局部来用.
nonlocal:把离他最近的一层的变量拿过来, 不会找全局
3. 闭包
内部函数访问外部函数的局部变量
好处:
1. 安全
2. 常驻内存, 提高效率
1. globals()和locals()
a = 100 # 全局变量 def main(): # 全局变量 a = 50 # 按就近原则, 局部变量 print(a) # 局部变量 print(‘哎!最近天气有点热!‘) # 局部变量 print(globals()) # globals() 获取到全局作用域(内置,全局)中的所有名字 print(locals()) # locals() 查看当前作用域中的所有名字 main()
2. global和nonlocal
a = 90 def func(): global a # 把外面全局中的a引入, a 不在是局部变量,是全局变量 a = 30 # 修改赋值, 把全局重新赋值(变成了30) print(a) func() print(a) a = 10 # 又重新赋值 print(a) # 输出: # 30 # 30 # 10 a = 10 def func1(): a = 40 def func2(): # nonlocal a 只要是在局部中就可以引进来 nonlocal a # 找局部作用域中, 离他最近的那个变量引入进来 a = 20 # 把上面的a = 40 进行赋值,所以上面的a = 20 print(a) # 20 func2() print(a) # 20 func1() # 输出: # 20 # 20
3. 闭包
def func(): name = ‘小明‘ # 常驻内存 防止其他程序改变这个变量 def inner(): print(name) # 在内存函数中调用外层函数的变量,叫闭包,可以让一个局部变量常驻内存 return inner ret = func() ret() # 执行的是inner() # 闭包的好处 def func(): content = [‘小王‘,‘小张‘,‘小明‘] def inner(): # print("你好啊") # 没有使用外部变量, 不是闭包 print(content) # 使用了外部变量, 是闭包 return content # 在函数内部使用了外部变量, 闭包 print(inner.__closure__) # 查看inner是否是闭包, 如果有东西就是闭包,没东西就不是闭包 return inner fn = func() ret = fn() print(ret)
以上是关于python globals()和locals(),global和nonlocal,以及闭包的主要内容,如果未能解决你的问题,请参考以下文章
python globals()和locals(),global和nonlocal,以及闭包
016.Python闭包函数以及locals和globals