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)
 
 
 


猜你喜欢

转载自www.cnblogs.com/Pengdachui-1/p/11143024.html