您的位置:首页 > 编程语言 > Python开发

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

2017-08-05 15:49 405 查看
今天编程时遇到了一些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绝不是一门简简单单便可以掌握的语言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息