Python易错点整理——for和else的搭配使用、global的使用

今天编程时遇到了一些Python中易犯的错误,总结如下:
一、for和else的搭配使用:
在Python中for循环可以和else搭配使用,但是有些细节地方容易出错,比如:


for i in xrange(1,10):
	if i == 1:
		print("Yes")
else:
	print("No")


你可能打算希望程序最终输出Yes,但是在这个程序段中最终输出的是Yes和No,可以发现两个输出语句都执行了,原因便是执行完for循环后,继续执行了else下的语句,为了不再执行else下的语句,我们在if判断条件下加上break,及时跳出循环。修改代码如下:


for i in xrange(1,10):
	if i == 1:
		print("Yes")
		break
else:
	print("No")


从中我们可以看出for和else搭配使用时的某些机制,以及容易出错的地方——break的使用。
二、global的使用:
Python因为是解释型语言,一行一行解释并运行,因此对于全局变量有些容易出错的地方。比如:


m = 10
def num():
	print(m)
num()

在这段代码里,num函数调用了全局变量m,结果自然是可以正常输出。但可能会有令人费解的情况出现:


m = 10
def num():
	m = 0
	print(m)
num()
print(m)

输出结果为0、10.
不禁令人思索,到底为什么m的值没有被改变。原因便是函数里的m是局部变量,函数num创建了一个叫做m的局部变量,并令其等于0,而并没有改变全局变量m的值,二者并不是同一个变量。
但是,另外还有种情况:


m = 10
def num():
	print(m)
	m = 0
num()
print(m)

该程序段无法执行,会出现错误如下:
UnboundLocalError: local variable 'm' referenced before assignment



大概意思便是:局部变量在赋值前被引用,修改方法如下:


m = 10
def num():
	global m
	print(m)
	m = 0
num()
print(m)

即将m声明为全局变量,令Python明白变量m并非是局部变量,而是全局变量,至此在函数内部对m的修改也会生效,此时输出结果为:10,0。
还有种延伸情况:


m = ["name","app"]
def modfiy():
	m = ["abc"]
	print(m)
modfiy()
print(m)

输出结果为:
['abc']
['name', 'app']
可见,Python将函数内的m视为了局部变量进行处理,但如果下面这样写:


m = ["name","app"]
def modfiy():
	m.append("sss")
	print(m)
modfiy()
print(m)

输出结果为:
['name', 'app', 'sss']
['name', 'app', 'sss']
可见Python将函数里的m视为全局变量处理,因此为了防止产生歧义,以及代码的健壮性,我认为应该在函数内部声明:
global m
但我们应尽量避免使用global,为了防止某些难以理解的错误发生。如果你想保存在代码里至始至终用到的值的时候,把它定义为一个类的属性。用这种方法的话就完全不需要用global了,当你要用这个值的时候,通过类的属性来访问就可以了:(类似于java的处理方法)



>>> class Baz(object):
...     bar = 42
... 
... def foo():
...     print Baz.bar  # global
...     bar = 0  # local
...     Baz.bar = 8  # global
...     print bar
... 
... foo()
... print Baz.bar
42
0
8



这就是global的大概使用注意事项,这与Python语言本身的特性密不可分,Python绝不是一门简简单单便可以掌握的语言。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangbowj123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值