python globals()和locals(),global和nonlocal,以及闭包
2020-12-13 05:31
标签:效率 col 命名 提高 文件 解释 输出 引入 pre python globals()和locals(),global和nonlocal,以及闭包 标签:效率 col 命名 提高 文件 解释 输出 引入 pre 原文地址:https://www.cnblogs.com/Pengdachui-1/p/11143024.html
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)
上一篇:Java集合框架——Set接口
下一篇:RT-thread线程创建
文章标题:python globals()和locals(),global和nonlocal,以及闭包
文章链接:http://soscw.com/essay/31195.html