名称空间

一,名称空间详解

                     

   1,名称空间,就是存放名字的地方,是对栈区的一种划分,这样做是为了防止有相同名字误操作的一种措施

    可以分为三种

    • 内置名称空间,存放python解释器内置的名字
      • 存活周期,打开python解释器启动就产生,关闭就销毁
    • 全局名称空间,只要不是函数内定义,也不是内置的,剩下的都是全局名称空间
      • 存活周期,python文件执行时则产生,关闭时则销毁
    • 局部名称空间,在调用函数时,运行函数代码中产生函数内名字
      • 存活周期,在调用时存活,关闭时销毁

  2,名字的查找优先级,当前位置向上一层层的查找

    • 顶层:内置名称空间
    • 中层:全局名称空间
    • 底层:局部名称空间
    •  1 第一种情况,先在局部里找名称
       2 input=111
       3 def fun():
       4     input=222
       5     print(input)
       6 fun()
       7 *************
       8 222
       9 第二种情况,先在局部里找,发现没有,就在全局里找
      10 input=111
      11 def fun():
      12         print(input)
      13 fun()
      14 *************
      15 111
      16 第三种情况,局部、全局都没有,就在内置里找
      17 def fun():
      18     print(input)
      19 fun()
      20 **************
      21 <built-in function input>

       

  3,注意点

    • 名称空间的嵌套关系是以函数定义阶段为准的,与调用关系无关
      1 x=111
      2 def fun():
      3     print(x)
      4 def poo():
      5     x=555
      6     fun() #这个x的变量是以定义位置为准,poo与fun是平级关系,不会互找的
      7 poo()
      8 *********
      9 111

       

  4,作用域

    • 全局作用域:内置名称空间、全局名称空间
      • 特点(存活是指没有被垃圾回收,有效是指能被访问到)
        • 全局存活
        • 全局有效,被所有函数共享
    • 局部作用域
      • 临时存活
      • 临时有效

  5,global与nonlocal

    • global,用于对不可变类型在局部位置修改全局名字对应的值
      x=1
      def foo():
          global x #声明x为全局名称空间的名字
          x=2
      foo()
      print(x) #结果为
    • nonlocal,当前函数的外层函数开始一层层去查找名字x,若是一直到最外层函数都找不到,则会抛出异常。,针对的是不可变类型
      1 1 def  f1():
      2 2     x=2
      3 3     def f2():
      4 4         nonlocal x
      5 5         x=3
      6 6     f2() #调用f2(),修改f1作用域中名字x的值
      7 7     print(x) #在f1作用域查看x
      8 8 
      9 9 f1()
    • 对于可变函数可以直接从局部修改外层
      1 x=[]
      2 def fun():
      3     x.append(111)
      4 fun()
      5 print(x)
      6 ***********
      7 [111]

posted on 2024-02-04 04:16  我才是最帅的那个男人  阅读(15)  评论(0)    收藏  举报

导航