python易错点

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.。。。。待续

你可能感兴趣的:(python)