由一个例子到python的名字空间

459 查看

例子引入

例1

可以正常输出结果: 并且需要注意,在func2使用x变量之前的名字空间就已经有了'x':1.

稍微改一点:如下

例2:

输出就开始报错: 而且在before func2也没有了x.

这两个例子正好涉及到了python里面最核心的内容:名字空间,正好总结一下,然后在解释这几个例子。


名字空间(Namespace)

比如我们定义一个”变量”

所以,这里更准确的叫法应该是名字。 一些语言中比如c,c++,java 变量名是内存地址别名, 而Python 的名字就是一个字符串,它与所指向的目标对象关联构成名字空间里面的一个键值对{name: object},因此可以这么说,python的名字空间就是一个字典.。

分类

python里面有很多名字空间,每个地方都有自己的名字空间,互不干扰,不同空间中的两个相同名字的变量之间没有任何联系一般有4种:LEGB四种

  • locals: 函数内部的名字空间,一般包括函数的局部变量以及形式参数
  • enclosing function: 在嵌套空间就是一个字典.。

    分类

    python里面有很多名字空间,每个地方都有自己的名字空间,互不干扰,不同空间中的两个相同名字的变量之间没有任何联系一般有4种:LEGB四种

    • locals: 函数内部的名字空间,一般包括函数的局部变量以及形式参数
    • enclosing function: 在嵌套 t;">
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      #!/usr/bin/env python
      # encoding: utf-8
      def func1():
          x = 1
          print globals()
          print 'before func1:', locals()
          def func2():
              a = 1
              print 'before fun2:', locals()
              a += x
              print 'after fun2:', locals()
          func2()
          print 'after func1:', locals()
          print globals()
      if __name__ == '__main__':
          func1()

可以正常输出结果: 并且需要注意,在func2使用x变量之前的名字空间就已经有了'x':1.

稍微改一点:如下

例2:

输出就开始报错: 而且在before func2也没有了x.

这两个例子正好涉及到了python里面最核心的内容:名字空间,正好总结一下,然后在解释这几个例子。


名字空间(Namespace)

比如我们定义一个”变量”

所以,这里更准确的叫法应该是名字。 一些语言中比如c,c++,java 变量名是内存地址别名, 而Python 的名字就是一个字符串,它与所指向的目标对象关联构成名字空间里面的一个键值对{name: object},因此可以这么说,python的名字空间就是一个字典.。

分类

python里面有很多名字空间,每个地方都有自己的名字空间,互不干扰,不同空间中的两个相同名字的变量之间没有任何联系一般有4种:LEGB四种

  • locals: 函数内部的名字空间,一般包括函数的局部变量以及形式参数
  • enclosing function: 在嵌套 ǽ数中外部函数的名字空间, 对fun2来说, fun1的名字空间就是。
  • globals: 当前的模块空间,模块就是一些py文件。也就是说,globals()类似全局变量。
  • __builtins__: 内置模块空间, 也就是内置变量或者内置函数的名字空间。

当程序引用某个变量的名字时,就会从当前名字空间开始搜索。搜索顺序规则便是: LEGB.