VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python 程序员经常犯的 10 个错误(2)

常规用一下。

1
2
3
>>> B.x = 2
>>> print A.x, B.x, C.x  
1 2 1

嗯,再试一下也一样。

1
2
3
>>> A.x = 3
>>> print A.x, B.x, C.x  
3 2 3

什么 $%#!&?? 我们只改了A.x,为什么C.x也改了?

在Python中,类变量在内部当做字典来处理,其遵循常被引用的方法解析顺序(MRO)。所以在上面的代码中,由于class C中的x属性没有找到,它会向上找它的基类(尽管Python支持多重继承,但上面的例子中只有A)。换句话说,class C中没有它自己的x属性,其独立于A。因此,C.x事实上是A.x的引用。

常见错误 3: 为 except 指定错误的参数

假设你有如下一段代码:

1
2
3
4
5
6
7
8
9
>>> try:  
...     l = ["a""b"]  
...     int(l[2])  
... except ValueError, IndexError:  # To catch both exceptions, right?  
...     pass
...  
Traceback (most recent call last):  
  File "<stdin>", line 3in <module>  
IndexError: list index out of range

这里的问题在于 except 语句并不接受以这种方式指定的异常列表。相反,在Python 2.x中,使用语法 except Exception, e 是将一个异常对象绑定到第二个可选参数(在这个例子中是 e)上,以便在后面使用。所以,在上面这个例子中,IndexError 这个异常并不是被except语句捕捉到的,而是被绑定到一个名叫 IndexError的参数上时引发的。

在一个except语句中捕获多个异常的正确做法是将第一个参数指定为一个含有所有要捕获异常的元组。并且,为了代码的可移植性,要使用as关键词,因为Python 2 和Python 3都支持这种语法:

1
2
3
4
5
6
7
>>> try:  
...     l = ["a""b"]  
...     int(l[2])  
... except (ValueError, IndexError) as e:    
...     pass
...  
>>>

常见错误 4:  不理解Python的作用域

Python是基于 LEGB 来进行作用于解析的, LEGB 是 Local, Enclosing, Global, Built-in 的缩写。看起来“见文知意”,对吗?实际上,在Python中还有一些需要注意的地方,先看下面一段代码:

1
2
3
4
5
6
7
8
9
10
>>> x = 10
>>> def foo():  
...     x += 1
...     print x  
...  
>>> foo()  
Traceback (most recent call last):  
  File "<stdin>", line 1in <module>  
  File "<stdin>", line 2in foo  
UnboundLocalError: local variable 'x' referenced before assignment

相关教程