zoukankan      html  css  js  c++  java
  • python名称空间和作用域

    python名称空间和作用域

    名称空间

    名称空间:例如a=1000,python解释器会开辟一块新的内存来存贮1000这个变量值,然后会有一个a指向这个1000,那么a存在哪里?其实他和变量值差不多,内存中开辟了一块名称空间专门存储变量名。

    1.内置名称空间

    当python解释器启动,就将一些自带的变量名,放在了内置名称空间,而且作用范围是真正的全局

    生命周期:python解释器启动生效,python解释器关闭失效

    2.全局名称空间

    除了内置和局部就是,全局名称空间

    生命周期:在文件执行时生效,在文件执行结束后失效

    x和zx

    x=1
    def zx():
    	pass
    

    3.局部名称空间

    用于存放函数调用嵌套函数体产生的名字

    生命周期:在文件执行时调用期间生效,在函数执行结束后失效

    def f1():
        def f2():
            print('from f2')
        f2()
    
    f1() 
    

    x = 1
    y = 2
    len = 100
    def zx():
        y = 3
        len = 1000
        print(f"x: {x}")
        print(f"y: {y}")
        print(f"len: {len}")
    zx()
    

    x: 1
    y: 3
    len: 1000

    验证了查找顺序

    x = 1
    def zx():
        print(x)
    x = 10
    zx()
    

    10

    因为python解释器是一句一句执行下去的,当到执行zx方法时,x的值已经改变了

    作用域,命名空间也被称为作用域!(全局的概念和java不同,局部不能改变不可变变量的值)

    python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围。

    每一个def都有自己独立的局部作用域,不会相互干扰

    L(local)局部作用域

    局部变量:包含在def关键字定义的语句块中,即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。Python中也有递归,即自己调用自己,每次调用都会创建一个新的局部命名空间。在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部定义全局变量,这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个 栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态。所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间。
    注意:如果需要在函数内部对全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量。

    E(enclosing)嵌套作用域

    E也包含在def关键字中,E和L是相对的,E相对于更上层的函数而言也是L。与L的区别在于,对一个函数而言,L是定义在此函数内部的局部作用域,而E是定义在此函数的上一层父级函数的局部作用域。主要是为了实现Python的闭包,而增加的实现。

    G(global)全局作用域

    即在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明的变量具有全局作用域,从外部开来,模块的全局变量就是一个模块对象的属性。
    注意:全局作用域的作用范围仅限于单个模块文件内

    B(built-in)内置作用域

    系统内固定模块里定义的变量,如预定义在builtin 模块内的变量。

    变量名解析LEGB法则

    搜索变量名的优先级:局部作用域 > 嵌套作用域 > 全局作用域 > 内置作用域
    LEGB法则: 当在函数中使用未确定的变量名时,Python会按照优先级依次搜索4个作用域,以此来确定该变量名的意义。首先搜索局部作用域(L),之后是上一层嵌套结构中def或lambda函数的嵌套作用域(E),之后是全局作用域(G),最后是内置作用域(B)。按这个查找原则,在第一处找到的地方停止。如果没有找到,则会出发NameError错误。

    x=1
    def f1():
        x=2
        def f2():
            print(x)
        return f2
    f1()()
    

    2

    参考博客:

    https://www.cnblogs.com/fireporsche/p/7813961.html

  • 相关阅读:
    一个经典的页面布局
    巧避new的一个原型设计模式
    讲解关于javascript的继承
    根据指定日期 算出该周的一周日期
    原型实现的一个观察者模式
    减少类之间的耦合性
    Android 代码下载
    (转)open gl 实例 demo vs2005 环境
    Tile editor 快捷键
    这是第一篇博客~
  • 原文地址:https://www.cnblogs.com/zx125/p/11329323.html
Copyright © 2011-2022 走看看