神刀安全网

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

1、滥用表达式作为函数参数默认值

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

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

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

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

解决方案:

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

2、错误地使用类变量

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

先看下面这个例子:

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

这样是有意义的:

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

再来一遍:

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

仅仅是改变了A.x,为什么C.x也跟着改变了。

在Python中,类变量都是作为字典进行内部处理的,并且遵循方法解析顺序(MRO)。

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

3、为异常指定不正确的参数

假设代码中有如下代码:

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

4、误解Python规则范围

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

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

5、修改遍历列表

下面这段代码很明显是错误的:

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

6、如何在闭包中绑定变量

看下面这个例子:

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

你期望的结果是:

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

实际上:

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

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

解决方案:

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

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

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

在b.py中:

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

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

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

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

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

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

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

9、未按规定处理Python2.x和Python3.x之间的区别

看一下foo.py:

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

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

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

但是在Python 3里:

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

解决方案:

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

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

10、滥用del方法

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

image

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 十个Python码农最容易犯的错误, 十个中有九个程序猿躲不过!

分享到:更多 ()