Python编程中易犯错误总结:for和else搭配使用及global关键字详解
今天我在Python编程时遇到了一些常见的错误。它们总结如下:

1、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的使用。
2.全局的使用:
由于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:赋值前引用局部变量“m”
大致意思是:局部变量在赋值之前被引用。修改方法如下:
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']
['名称','应用程序']
可见Python将函数内部的m当成局部变量来处理,但如果写成如下:
m = ["name","app"]
def modfiy():
m.append("sss")
print(m)
modfiy()
print(m)
输出是:
['名称','应用程序','sss']
['名称','应用程序','sss']
可以看出Python将函数中的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绝不是一门简单就能掌握的语言。