今天编程时遇到了一些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绝不是一门简简单单便可以掌握的语言。