• Python的学习之旅———名称空间与作用域


    名称空间:存放名字的地方,例子:x=1,1存放于内存中,名称空间正是存放名字x与1绑定关系的地方

    内置名称空间  全局名称空间  局部名称空间
    1、python解释器先启动,因而首先加载的是:内置名称空间
    2、执行文件,然后以文件为基础,加载全局名称空间
    3、在执行文件的过程中如果调用函数,则临时产生局部名称空间

    名称空间:存放名字与值绑定关系的地方


    内置名称空间:
    存放的是:内置的名字与值的绑定关系
    生效:python解释器启动
    失效:Python解释器关闭

    全局名称空间
    存放的是:文件级别定义的名字与值的绑定
    生效:执行python文件时,将该文件级别定义的名字与值的绑定关系存放起来
    失效:文件执行完毕

    局部名称空间
    存放的是:函数内部定义的名字与值的绑定关系
    生效:调用函数时,临时生效
    失效:函数调用结束

    加载顺序:先内置,再全局,最后局部
    查找名字的顺序:先局部,再全局,最后内置

    需要注意的是:在全局无法查看局部的,在局部可以查看全局的

    # max=1
    def f1():
          # max=2
         def f2():
             # max=3
             print(max) #p2
         f2()
    f1()
    print(max)  #P1

    max=1 是全局 都可以取到

    P1 =1 P2 =1

    max=2 

    赋值要在打印前

    作用域

    全局作用域:包含内置名称空间的名字与全局名称空间的名字
    全局存活,全局有效

    局部作用域:包含局部名称空间的名字
    临时存活,局部有效
    LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__
    locals 是函数内的名字空间,包括局部变量和形参
    enclosing 外部嵌套函数的名字空间(闭包中常见)
    globals 全局变量,函数定义所在模块的名字空间
    builtins 内置模块的名字空间
    globals() 里面放的是全局作用域里空间的对应关系 以字典的形式展现 如果在全局定义 x=10000000001 也会在print下
    展现出来 不是把x的值存起来,也不是以字典存的.只是用字典的形式显示出来了。包括 内置 和全局
    locals()放在哪就显示那的空间名字 如果locals放在全局 那么就有 locals() is globals().
    如果放在 定义的函数内部 就会显示内部的空间名对应。这个时候 !=globals()

    作用域关系,在函数定义时,就已经固定了,与调用位置无关

    global   在任何地方用,都是修改全局的变量值  global x 
    x=1111
    nonlocal 在函数内部用 逐级网上修改 相应的是值 nonlocal x
    x=1111
    def f1():
    x=2
    def f2():
    x=6
    def f3():
    nonlocal x # 把 x=106向上找 x 修改x=106
    x=106

    f3()
            print(x)
    f2()
    print(x)
    f1()

    结果

    106
    2

    向上修改一级的不是全部修改 如果函数内部找不到 就会报错

  • 相关阅读:
    阅读计划博文
    系统设计时所实现的质量属性战术
    关于如何提高系统的可用性和易用性
    jdbc.properties
    JDBCUtil
    软件质量属性的场景描述
    架构漫谈阅读笔记
    软件架构师工作过程
    orm框架中entityframework的 增删改查操作
    事件和委托
  • 原文地址:https://www.cnblogs.com/surehunter/p/7562898.html
Copyright © 2020-2023  润新知