zoukankan      html  css  js  c++  java
  • python—命名空间、作用域查找顺序、闭包

    名称空间

    name space,如下图:

    x = 1, 1存放在内存中,1 会有一个内存地址,x 则 存放在 name space 里,并同时记录了 1的内存地址,

    名称空间是存放了变量x与1绑定关系的地方

    名称空间共3种 :

    • locals: 是函数内的名称空间,包括局部变量和形参。
    • globals: 全局变量,函数定义所在模块的名字空间。全局存活,全局有效
    • builtins: 内置模块的名字空间

    不同变量的作用域不同就是由这个变量所在的命名空间决定的。

    查看作用域方法 globals(),locals()


    作用域查找顺序

    level = 'L0'
    n = 22
    def func():
        level = 'L1'
        n = 33
        print('func',locals())
    
        def outer():
            n = 44
            level = 'L2'
            print('outer',locals(),n)
    
            def inner():
                level = 'L3'
                print('inner',locals(),n) #此外打印的n是多少?
            inner()
        outer()
    
    func()
    # 打印:
    # func {'n': 33, 'level': 'L1'}
    # outer {'level': 'L2', 'n': 44} 44
    # inner {'level': 'L3', 'n': 44} 44
    

    变量查找顺序:

    LEGB : locals -> enclosing function -> globals -> builtins

    • locals 是函数内的名字空间,包括局部变量和形参
    • enclosing 外部嵌套函数的名字空间
    • globals 全局变量,函数定义所在模块的名字空间
    • builtins 内置模块的名字空间

    python中的闭包

    def func():
        n = 10
    
        def func2():
            print('func2:',n)
        return func2
    
    f = func()
    f()  #func2: 10
    
    外部函数func 里定义一个 内部函数func2,我们直接在外面是不能调用内部函数的。
    但是现在外部函数把 内部函数给返回了,相当于我们在外面拿到了内部函数 func2.
    总结一下:我们在外部可以执行func内部的函数,并且还可以用他内部函数作用域里面的变量值, 这个现象就是闭包
    

    (关于闭包的学习,以下内容我参考了:https://www.cnblogs.com/Lin-Yi/p/7305364.html 的博客,先把这篇博客地址在这儿存一下。)

    一点需要注意:使用闭包的过程中,一旦外函数被调用一次返回了内函数的引用,虽然每次调用内函数,是开启一个函数执行过后消亡,但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量

    #coding:utf8
    def outer(x):
        def inner(y):
            nonlocal x
            x+=y
            return x
        return inner
    
    
    a = outer(10)
    print(a(1)) //11
    print(a(3)) //14
    

    两次分别打印出11和14,由此可见,每次调用inner的时候,使用的闭包变量x实际上是同一个 !

  • 相关阅读:
    每日一个设计模式之策略模式
    Java发送get和post请求
    sql分组取最大值
    解析xml
    jsp:include
    schema的详解2
    文法和语言
    高级语言程序简介
    Dataframe根据某一列的值获取满足条件的行的其他列的值
    Dataframe数值转为二维列表
  • 原文地址:https://www.cnblogs.com/friday69/p/9226004.html
Copyright © 2011-2022 走看看