十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!
2018-08-06 本文已影响90人
Python新世界

1、滥用表达式作为函数参数默认值
Python允许开发者指定一个默认值给函数参数,虽然这是该语言的一个特征,但当参数可变时,很容易导致混乱,例如,下面这段函数定义:

在上面这段代码里,一旦重复调用foo()函数(没有指定一个bar参数),那么将一直返回'bar',因为没有指定参数,那么foo()每次被调用的时候,都会赋予[]。下面来看看,这样做的结果:

解决方案:


2、错误地使用类变量

先看下面这个例子:

这样是有意义的:

再来一遍:

仅仅是改变了A.x,为什么C.x也跟着改变了。
在Python中,类变量都是作为字典进行内部处理的,并且遵循方法解析顺序(MRO)。

3、为异常指定不正确的参数
假设代码中有如下代码:



4、误解Python规则范围
Python的作用域解析是基于LEGB规则,分别是Local、Enclosing、Global、Built-in。实际上,这种解析方法也有一些玄机,看下面这个例子:




5、修改遍历列表
下面这段代码很明显是错误的:



6、如何在闭包中绑定变量
看下面这个例子:

你期望的结果是:

实际上:

是不是非常吃惊!出现这种情况主要是因为Python的后期绑定行为,该变量在闭包中使用的同时,内部函数又在调用它。
解决方案:

7、创建循环模块依赖关系


在b.py中:

首先,让我们试着导入a.py:





无论何时导入,一切都可以正常运行:

8、与Python标准库模块名称冲突

9、未按规定处理Python2.x和Python3.x之间的区别
看一下foo.py:

在Python 2里面可以很好地运行:

但是在Python 3里:

解决方案:


在 Python招聘指南里有许多关于Python 2与Python 3在移植代码时需要关注的注意事项与讨论,大家可以前往看看。
10、滥用del方法





