1.全局变量
python中对全局变量的处理有些技巧性。
一般而言,若要在某一个函数(或者局部代码段)“访问”(或者说read)全局变量,是不需要事先声明global的
比如下列代码
1 a = 1 2 3 def func(): 4 b = a 5 print b 6 7 if __name__ == '__main__': 8 func()
将输出4。func中的a为全局变量。
如果,我们要改变全局变量,必须声明global。
看下面的代码
a = 1 def func(): global a a = 4 if __name__ == '__main__': func() print a
此时输出4。如果没有global的声明,改变的将是局部变量a,输出结果为1。
如果a是list结构呢?
1 a = [1, 5] 2 3 def func(): 4 b = a 5 print b 6 7 if __name__ == '__main__': 8 func()
和前面例子一样,输出[1, 5]
改一下
1 a = [1, 5] 2 3 def func(): 4 global a 5 a = [2, 6] 6 7 if __name__ == '__main__': 8 func() 9 print a
输出[2, 6],我们更改了全局变量a。删除global声明,输出[1, 5],改变的是局部变量。
到此为止,无论a的数据类型是什么,其表现的特性是一致的。
下面看两个另类的例子。
例子一
1 a = 2 2 3 def func(): 4 a = a + 3 5 6 if __name__ == '__main__': 7 func()
这段代码会报错:Line 4: Error: local variable 'a' referenced before assignment
很明显,a在这里被当成了局部变量,而不是全局变量。所以正确的做法是声明global a
例子二
1 a = [1, 4] 2 3 def func(): 4 a[0] = 2 5 a[1] = 3 6 7 if __name__ == '__main__': 8 func() 9 print a
这段代码我们并没有声明a为全局变量,但最后输出[2, 3]。这一点要注意。可以这样理解。这应该和python内部处理数据类型的方式有关。
一个没有验证过的想法是,在函数func中将a看做“指针变量”,它本身的值不变,但是可以改变它指向的地址存储的值。
而在上面的例子中func函数里包含a=[2, 6],这是一个全新的局部list对象a初始化的过程。
这可能与list的深浅拷贝有关。具体原因我也不太清楚。待解决。但要记住上述例子所展示的这个事实。
2.。。。。待续