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)
 
 
 


原文地址:https://www.cnblogs.com/Pengdachui-1/p/11143024.html

时间: 2024-10-09 10:01:03

python globals()和locals(),global和nonlocal,以及闭包的相关文章

Python globals和locals函数_reload函数

Python globals和locals函数_reload函数: globals( ): 返回所有能够访问到的全局名字 num = 5 sum = 0 def add(num): func_sum = 0 func_sum += num return func_sum print(globals()) ''' {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importl

python中的关键字global和nonlocal

知识点: global将一个变量变为全局变量 nonlocal改变最近的变量,又不是全局作用. 1.global 在python中,当引用一个变量的时候,对这个变量的搜索按找本地作用域(Local).嵌套作用域(Encolosing function locals).全局作用域(Global).内置作用域(builtins模块)的顺序来进行的,即所谓的LEGB规则. m = 1 #全局 def fun1(): m = 2 #嵌套 def fun2(): m = 3 #本地 fun2() fun1

python(动态传参、命名空间、函数嵌套、global和nonlocal关键字)

一.函数的动态传参 1.*args位置参数动态传参 def chi(*food): print(food) chi("烧烤","火锅","虾吃虾涮","烤鱼") 多个位置参数传递进去,收到的内容是元组tuple,动态参数的位置必须要在位置参数后面 2**kwargs 关键字参数动态传参 def chi(**food): print(food) chi(zhangqing="吃点好的",lianda=&quo

python中global 和 nonlocal 的作用域

python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 . 一 global global关键字用来在函数或其他局部作用域中使用全局变量.但是如果不修改全局变量也可以不使用global关键字. 1 gcount = 0 2 3 def global_test(): 4 gcount+=1 5 print (gcount) 6 global_test() D:\Python34\python.exe E:/PycharmProje

Python globals() locals() vars() 三个内建函数的区别

首先参考官方文档对这三个函数的介绍: 2. Built-in Functions – Python3.5 1.globals() 返回当前全局符号表, 通常是返回当前模块下的全局符号表, 比如全局内建的函数,以及模块里的全局符号(定义声明的变量,类, 实例等), 在函数或者类方法中, globals()返回的模块符号表 是其所在模块, 而不是调用模块. 2.locals() 更新并以字典形式返回当前局部符号表. 自由变量由函数块的locals() 返回, 而不会由 class 块来返回. 需要注

python学习第十天,名称空间与作用域,函数的嵌套,global 和 nonlocal

名称空间: 内置名称空间: 在打开pytharm是加载 全局名称空间: 在运行py文件是加载 局部名称空间(临时名称空间) :在py文件中调用时加载 def func(): ----->函数定义 pass ------->函数体 func()------------->函数调用 函数定义时:内存中只储存与函数名的对应关系,函数体的内容不储存 函数调用时:才执行函数体的内容,创建临时空间,随着函数执行结束,内存中的临时名称空间里面的内容也清空 作用域: 全局作用域:内置名称空间里的内容+全

Python全栈__动态参数、名称空间、作用域、作用域链、加载顺序、函数的嵌套、global、nonlocal

1.动态参数 当实参数量与形参数量相等时,参数传递正常. def func1(a, b, c): pass func1(1, 2, 3) 当实参数量与形参数量不相等时,则会报错. def func1(a, b, c): pass func1(1, 2, 3, 4, 5, 6, 6) 用户传入到函数中的实参数量不确定时,或者为了以后扩展,此时要用到动态参数 *args  **kwargs(万能参数). 顺序: 位置参数,*args,默认参数,**kwargs 1.*args *args是接收的是所

Python之函数(四)函数的嵌套和global、nonlocal

函数的嵌套 函数的嵌套 def func() print(1) def f1(): print(2) return f1() func() 结果为:1 2 不管在什么位置,只要是函数+()就是在调用此函数 函数调用执行后,函数体中开辟的空间就自动销毁了 def func(): a=1 def foo(): b=2 print(b) print(a) def f1(): print(b) return f1() return foo() print(func()) 结果为:2 1 2 None p

Python Global和Nonlocal的用法

nonlocal 和 global 也很容易混淆.简单记录下自己的理解. 解释 global 总之一句话,作用域是全局的,就是会修改这个变量对应地址的值. global 语句是一个声明,它适用于整个当前代码块. 这意味着列出的标识符将被解释为全局变量. 尽管自由变量可能指的是全局变量而不被声明为全局变量. global语句中列出的名称不得用于该全局语句之前的文本代码块中. global语句中列出的名称不能定义为形式参数,也不能在 for 循环控制目标.class定义.函数定义.import语句或