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

转载于:https://www.cnblogs.com/ShaneZhang/archive/2013/05/20/3089219.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值