例子引入
例1
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
.
1 2 3 4 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/usr/bin/env python # encoding: utf-8 def 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
.
1 2 3 4 5 6 7 8 9 10 |
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 += x UnboundLocalError: local variable 'x' referenced before assignment |
这两个例子正好涉及到了python
里面最核心的内容:名字空间,正好总结一下,然后在解释这几个例子。
名字空间(Namespace)
比如我们定义一个”变量”
1 2 |
In [14]: a NameError: 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 = 1print globals()print 'before func1:', locals()def func2():a = 1print 'before fun2:', locals()a += xprint 'after fun2:', locals()func2()print 'after func1:', locals()print globals()if __name__ == '__main__':func1()