由一个例子到python的名字空间
admin
2023-07-31 00:47:17
0

例子引入

例1

12345678910111213141516 #!/usr/bin/env python# encoding: utf-8def 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.

1234 before func1: {\’x\’: 1}before fun2: {\’a\’: 1, \’x\’: 1}after fun2: {\’a\’: 2, \’x\’: 1}after func1: {\’x\’: 1, \’func2\’: <function func2 at 0x7f7c89700b90>}

稍微改一点:如下

例2:

12345678910111213 #!/usr/bin/env python# encoding: utf-8def func1():    x = 1    print \’before func1:\’, locals()    def func2():        print \’before fun2:\’, locals()        x += x #就是这里使用x其余地方不变        print \’after fun2:\’, locals()    func2()    print \’after func1:\’, locals()if __name__ == \’__main__\’:    func1()

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

12345678910 before func1: {\’x\’: 1}before fun2: {}Traceback (most recent call last):  File \”test.py\”, line 18, in <module>    func1()  File \”test.py\”, line 14, in func1    func2()  File \”test.py\”, line 11, in func2    x += xUnboundLocalError: local variable \’x\’ referenced before assignment

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


名字空间(Namespace)

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

12 In [14]: aNameError: name \’a\’ is not defined

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

分类

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

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

    分类

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

    • locals: 函数内部的名字空间,一般包括函数的局部变量以及形式参数
    • enclosing function: 在嵌套 t;\”>
      12345678910111213141516 #!/usr/bin/env python# encoding: utf-8def 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.

1234 before func1: {\’x\’: 1}before fun2: {\’a\’: 1, \’x\’: 1}after fun2: {\’a\’: 2, \’x\’: 1}after func1: {\’x\’: 1, \’func2\’: <function func2 at 0x7f7c89700b90>}

稍微改一点:如下

例2:

12345678910111213 #!/usr/bin/env python# encoding: utf-8def func1():    x = 1    print \’before func1:\’, locals()    def func2():        print \’before fun2:\’, locals()        x += x #就是这里使用x其余地方不变        print \’after fun2:\’, locals()    func2()    print \’after func1:\’, locals()if __name__ == \’__main__\’:    func1()

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

12345678910 before func1: {\’x\’: 1}before fun2: {}Traceback (most recent call last):  File \”test.py\”, line 18, in <module>    func1()  File \”test.py\”, line 14, in func1    func2()  File \”test.py\”, line 11, in func2    x += xUnboundLocalError: local variable \’x\’ referenced before assignment

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


名字空间(Namespace)

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

12 In [14]: aNameError: name \’a\’ is not defined

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

分类

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

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

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

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...