例子引入
例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
里面最核心的内容:名字空间,正好总结一下,然后在解释这几个例子。
比如我们定义一个”变量”
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
里面最核心的内容:名字空间,正好总结一下,然后在解释这几个例子。
比如我们定义一个”变量”
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
.