zoukankan      html  css  js  c++  java
  • Python入门day15——名称空间及作用域

    一、名称空间namespacs:
    
    存放名字的地方,是对栈区的划分,有了名称空间之后,就可以在栈区中存放相同的名字,详细的名称空间分为三种:
    
    1. 内置名称空间
           # 存放的名字:存放的python解释器内置的名字
           '''
           >>> print
           <built-in function print>
           >>> input
           <built-in function input>
           '''
           # 存活周期:python解释器启动则产生,python解释器关闭则销毁
    2. 全局名称空间
           # 存放的名字:只要不是函数内定义、也不是内置的,剩下的都是全局名称空间的名字
           # 存活周期:python文件执行则产生,python文件运行完毕后销毁
           import os
           x=10
           if 13 > 3:
               y=20
               if 3 == 3:
                   z=30
           # x y z 都是全局变量        
           # func=函数的内存地址 
           def func():
               a=111
               b=222
           print(func) # <function func at 0x000001EC9C043F70> func是一个全局变量
           class Foo:
               pass # foo也是全局变量
    3. 局部名称空间
           # 存放的名字:在调用函数时,运行函数体代码过程中产生的函数内的名字
           # 存活周期:在调用函数时存活,函数调用完毕后则销毁
           def func(a,b):
               print(a,b)
           func(10,1)
           func(11,12)
           func(13,14)
           func(15,16)
    4. 名称空间的加载顺序
       内置名称空间>全局名称空间>局部名称空间
    5.  销毁顺序
       局部名称空间>全局名空间>内置名称空间
    6. 1名字的查找优先级:当前所在的位置向上一层一层查找
           # 如果当前在局部名称空间:局部名称空间—>全局名称空间->内置名称空间
           input=333
           def func():
               input=444
               print(input)
           func() # 444
       
           # 如果当前在全局名称空间
           # 全局名称空间->内置名称空间
           input=333
           def func():
               input=444
           func()
           print(input) # 333
       
           # 示范1:
           def func():
               print(x)
           x=111
           func() # 11
       
           # 示范2:名称空间的"嵌套"关系是以函数定义阶段为准,与调用位置无关
           x=1
           def func():
              print(x)
           def foo():
               x=222
               func()
           foo() # 1
       
           # 示范3:函数嵌套定义
           input=111
           def f1():
               def f2():
                   # input=333
                   print(input)
               input=222
               f2()
           f1() # 222
       
           # 示范4:
           x=111
           def func():
               print(x) #
               x=222
           func()
       
    
    二:作用域:作用范围
    
    - 全局作用域:内置名称空间、全局名称空间
          # 1、全局存活
          # 2、全局有效:被所有函数共享
          x=111
          def foo():
              print(x,id(x))
          def bar():
              print(x,id(x))
          foo() # 111 140723670934624
          bar() # 111 140723670934624
          print(x,id(x)) # 111 140723670934624
      
    - 局部作用域: 局部名称空间的名字
          # 1、临时存活
          # 2、局部有效:函数内有效
          
          def foo(x):
              def f1():
                  def f2():
                      print(x)
          # LEGB概念
          # local,本地作用域、局部作用域的local命名空间。函数作用域的local命名空间。函数调用时创建,调用结束时候消亡。
          # Enclosing:嵌套函数外层函数的命名空间。
          # Global:全局作用域。一个模块的命名空间.模块被import时候创建,解释器退出时消亡。
          # Bulid-in。内置模块的命名空间,生命周期从python解释器启动时创建到解释器退出时消亡。例如print(open)都是内置的变量。
          # 所以一个名词的查找顺序就是LEGB。(从本级逐级向外找)。
          
          # builtin
          # global
          def f1():
              # enclosing
              def f2():
                  # enclosing
                  def f3():
                      # local
                      pass
    
    - global与nonlocal
    
        # 示范1:
        x=111
        def func():
            x=222
        func()
        print(x) # 111
        
        # 示范2:如果再局部想要修改全局的名字对应的值(不可变类型),需要用global
        x=111
        def func():
            global x # 声明x这个名字是全局的名字,不要再造新的名字了
            x=222
        func() # 调用func
        print(x) # 222
        
        # 示范3:
        l=[111,222]
        def func():
            l.append(333)
        func() # 调用func
        print(l) # [111,222,333]
        
        # nonlocal(了解): 修改函数外层函数包含的名字对应的值(不可变类型)
        x=0
        def f1():
            x=11
            def f2():
                nonlocal x
                x=22
            f2()
            print('f1内的x:',x)
        f1() # f1内的x: 22
        
        
        def f1():
            x=[]
            def f2():
                x.append(1111)
            f2()
            print('f1内的x:',x)
        f1() # f1内的x: [1111]
  • 相关阅读:
    Excel与Google Sheets中实现线性规划求解
    Optaplanner终于支持多线程并行运行
    【译】Optaplanner开发手册本地化: (0)
    多工序、多机台(产线)环境下的排程要点
    设计Optaplanner下实时规划服务的失败经历
    Optaplanner规划引擎的工作原理及简单示例(2)
    vim 分屏
    vim autocmd
    irun vcs option
    记录
  • 原文地址:https://www.cnblogs.com/yding/p/12527503.html
Copyright © 2011-2022 走看看