#!/usr/bin/env python
a_string = "This is a global variable"
def foo():
print locals()
print a_string #1
foo()
执行结果:
{}
This is a global variable
在foo函数里,先打印了locals,是空的。然后在#1处,打印a_string这个变量。这时候发生以下事情:
1. python先在locals里面寻找,locals是空的,所以找不到。
2.python在globals里面寻找,可以找到a_string,然后获得值,打印。
再看一个例子:
#!/usr/bin/env python
a_string = "This is a global variable"
def foo():
a_string = "test" #1
print locals()
print a_string #2
def foo1():
global a_string #4
a_string = "Oh. global variable has been changed in foo1." #5
foo()
print a_string #3
print "---------------------"
foo1()
print a_string#6
执行结果为:
{'a_string': 'test'}
test
This is a global variable
---------------------
Oh. global variable has been changed in foo1.
上面的代码中,有以下几个要点:
1. #1是要给a_string赋值(即修改变量值),先在locals中寻找a_tring, 没有找到,则新创建local变量。所以打印locals时,结果为:{'a_string': 'test'} 。
2. #2处打印时,按照我们之前说的变量分辨规则, 先从locals中寻找a_tring变量,在#1处有定义,所以直接打印
3.#3处不在任何函数中,位于全局作用域,所以直接查找globals,找到了a_string,打印。
4.#4处声明了一个全局变量(a_string之前已经声明,这里表示在local作用域中使用全局a_string)
#5处修改a_string, 因为#4中声明了a_string是全局的,所以修改a_string之后,#6处打印的是修改后的值
变量生存周期
#!/usr/bin/env python
def foo():
x = 1
foo()
print x # 1
执行结果:
Traceback (most recent call last):
File "./5.py", line 6, in <module>
print x # 1
NameError: name 'x' is not defined
变量都是有生存周期(lifetime)的,变量的生存周期与变量声明时的作用域息息相关。其作用域销毁时,变量也就销毁了。
上面的例子主要有以下要点:
1. x是在foo函数内定义的,在foo的locals中存在,因此,其作用域是foo函数的作用域。
也就是说:foo运行时,locals创建,x位于locals中,结束后,foo的locals被销毁,x不在了。
2. #1处打印x,#1位于全局作用域,因此,其在globals中寻找x,没有找到,所以会报错。