• Python学习心得第四周-03 名称空间与作用域



    1、什么是名称空间
    名称空间是存放名字与值绑定关系的地方

    要取到值必须通过名字才能找,而名字又在名称空间中存放着,所以我们在取值时首先是去名称空间中名字
    找到了名字自然就拿到值的内存地址。。。。

    2、名称空间分为三种:
    1、内置名称空间:存放的python解释器自带的名字
    生命周期:在解释器启动时产生,在解释器关闭时回收

    2、全局名称空间:除了内置的与局部的之外名字都属于全局名称空间
    生命周期:在程序文件执行时就立刻产生,在程序执行完毕后就回收
    #            其中:x,y,foo,z都是全局名称空间中的名字
                x=1
                y=2
    
                def foo():
                    x=1
                    y=2
    
                foo()
    
    
                if y > x:
                    z=3
        3、局部名称空间:存放的是函数内部定义的名字
    生命周期:在调用函数时临时生效,在函数结束后立刻回收


    加载顺序:内置名称空间-》全局名称空间-》局部名称空间
    加载名称空间的目的是为了将名字与值的绑定关系存放起来
    而存的目的是为了取,也就是说,当我们在查找名字时,必然
    是在三者之一找到

    查找顺序:局部名称空间-》全局名称空间-》内置名称空间
    基于当前所在的位置往后查找
    # len=100
    # print(len) # 站在全局查找
    
    def foo():
        # len=2222
        print(len)
    foo()
    
    
    x=100
    y=200
    # 强调:函数的形参名属于局部名称空间
    def foo(x,y):
        print(x,y)
    
    foo(1,2)
    
    x=2222
    def f1():
        # x=1
        def f2():
            # x=2
            print('from f2',x)
        f2()
    
    x=111
    f1()
        4、作用域
    域指的是范围,作用域指的是作用范围
    分为:
    全局作用范围:包含内置名称空间与全局名称空间中的名字
    特点:全局有效,全局存活
    局部作用范围:包含的局部名称空间的名字
    特点:局部有效,临时存活
    x=1
    
    def f1():
        def f2():
            def f3():
                x=3
                print(x)
            f3()
        f2()
    
    f1()
    
    ###
    def foo():
        print(x)
    
    foo()

    了解:globals与locals
    x=1111111111111111111111111111111111111
    
    def foo():
        y=2
        print(locals())
    
    print(globals()) # 返回的是全局作用域中的名字
    print(dir(globals()['__builtins__'])) # 返回的是全局作用域中的名字
    
    print(locals() is globals())
    
    foo()
    

      


    如何打破函数层级带来的访问限制,让我能够在任意位置都可以访问到一个内部函数
    基于函数对象的概念将一个内部函数返回到全局使用,从而打破了函数的层级限制

    (******)
    函数的作用域关系是在函数定义阶段就已经固定死的,与函数的调用位置无关,
    即在调用函数时一定要跑到定义函数的位置寻找作用域关系
    x=111
    def outter():
        x=33333
        def inner():
            print('from inner',x)
            # x=4444
        return inner
    
    f=outter() #f=指向outter.locals.inner
    # f()
    
    def foo():
        x=222
        f()
    
    foo()
    x=4444
    global :在局部声明名字是来自于全局的
    x=1
    
    def func():
        global x
        x=2
    
    func()
    print(x)
    
    
    x=[]
    def func():
        x.append(1)
    
    func()
    print(x)
    nonlocal : 声明变量是来自于当前层外层的(必须是在函数内的)
    x=222
    def f1():
        x=111
        def f2():
            global x
            x=0
    
        f2()
        print('f1---》',x)
    
    f1()
    print(x)
    
    #############
    x=222
    def f1():
        x=111
        def f2():
            nonlocal x
            x=0
    
        f2()
        print('f1---》',x)
    
    f1()
    print('global===》',x)
    

      

    函数对象、函数嵌套、名称空间与作用域、装饰器

    链接:http://www.cnblogs.com/linhaifeng/articles/7532497.html

    
    
  • 相关阅读:
    C# 比较多个数组(lambda,匿名比较器)
    JPA javax.persistence.TransactionRequiredException
    JPA:identifier of an instance of was altered from
    JPA 连表查询
    java json转换(二)
    java querydsl使用
    SpringCloud 过滤器
    Android : Resource is not a Drawable (color or path)
    springcloud 新增微服务
    序列化二叉树
  • 原文地址:https://www.cnblogs.com/zhutiancheng/p/9324076.html
Copyright © 2020-2023  润新知