Python易错点整理——for和else的搭配使用、global的使用
2017-08-05 15:49
405 查看
今天编程时遇到了一些Python中易犯的错误,总结如下:
一、for和else的搭配使用:
在Python中for循环可以和else搭配使用,但是有些细节地方容易出错,比如:
你可能打算希望程序最终输出Yes,但是在这个程序段中最终输出的是Yes和No,可以发现两个输出语句都执行了,原因便是执行完for循环后,继续执行了else下的语句,为了不再执行else下的语句,我们在if判断条件下加上break,及时跳出循环。修改代码如下:
从中我们可以看出for和else搭配使用时的某些机制,以及容易出错的地方——break的使用。
二、global的使用:
Python因为是解释型语言,一行一行解释并运行,因此对于全局变量有些容易出错的地方。比如:
在这段代码里,num函数调用了全局变量m,结果自然是可以正常输出。但可能会有令人费解的情况出现:
输出结果为0、10.
不禁令人思索,到底为什么m的值没有被改变。原因便是函数里的m是局部变量,函数num创建了一个叫做m的局部变量,并令其等于0,而并没有改变全局变量m的值,二者并不是同一个变量。
但是,另外还有种情况:
该程序段无法执行,会出现错误如下:
UnboundLocalError: local variable 'm' referenced before assignment
大概意思便是:局部变量在赋值前被引用,修改方法如下:
即将m声明为全局变量,令Python明白变量m并非是局部变量,而是全局变量,至此在函数内部对m的修改也会生效,此时输出结果为:10,0。
还有种延伸情况:
输出结果为:
['abc']
['name', 'app']
可见,Python将函数内的m视为了局部变量进行处理,但如果下面这样写:
输出结果为:
['name', 'app', 'sss']
['name', 'app', 'sss']
可见Python将函数里的m视为全局变量处理,因此为了防止产生歧义,以及代码的健壮性,我认为应该在函数内部声明:
global m
但我们应尽量避免使用global,为了防止某些难以理解的错误发生。如果你想保存在代码里至始至终用到的值的时候,把它定义为一个类的属性。用这种方法的话就完全不需要用global了,当你要用这个值的时候,通过类的属性来访问就可以了:(类似于java的处理方法)
这就是global的大概使用注意事项,这与Python语言本身的特性密不可分,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绝不是一门简简单单便可以掌握的语言。
相关文章推荐
- Python的for和break循环结构中使用else语句的技巧
- Python的for和break循环结构中使用else语句的技巧
- Python中else语句块(和if、while、for、try搭配使用)
- python中的for...else的使用方法
- 【练习】题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句
- Python学习笔记十二:列表(4)--len 、in、For的使用
- MySQLdb for Python使用指南/Python的数据库操作
- [Python]MySQLdb for Python使用指南/Python的数据库操作
- python for ,loop ,else condition test
- IronPython for ASP.NET:使用共享代码
- Python中else语句整理
- 求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句
- ffmpeg的编译(for x86,for arm)安装及使用(网络资料整理)
- [Python]MySQLdb for Python使用指南/Python的数据库操作
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else...
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else...
- FCKeditor2.3 For PHP 详细整理的使用参考
- MySQLdb for Python使用指南/Python的数据库操作
- [Python]MySQLdb for Python使用指南/Python的数据库操作
- python的for和while竟然有else语句,我石化了