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 中locals() 和 globals()

globals和locals的区别

python globals()和locals(),global和nonlocal,以及闭包

016.Python闭包函数以及locals和globals

Python 两个内置函数: locals 和 globals

Python内置函数globals_locals 的使用