Python程序员常犯的7个错误(新手)

错误1:函数的默认参数使用不当

Python允许我们为参数指定一个默认参数值,这是很好的特性。但是当默认参数是mutable类型时,就容易忽略下面的问题:

这里一个常犯的错误是,想当然的认为使用默认参数调用foo函数时,bar的默认值总为[]。例如我们重复调用foo()(不指定参数),期望它每次返回的都是‘abc’。这是错的,实际上返回如下结果:

这是因为这个默认参数只创建一次,不管你调用多少次这个函数。

可以修改为如下代码:

错误2:类成员变量的使用

看下面一个例子:

好,没什么问题。

和预想的一样

这他妈是怎么回事,我们只改变了A.num,为什么C.num也改了。

在Python中,类成员变量在内部是以字典形式处理的。在上面代码中,因为num在C中没有找到,它会查找它的基类。(和B不同)

错误3:异常处理参数不正确

上面问题在于except语句不接受list。正确的抓取多个异常应使用元组,为了兼容Python2和Python3,我们使用as关键字,如下:

错误4:错误理解Python作用域规则

Python作用域基于LEGB规则,代表Local, Enclosing,Global, Built-in。但是在Python中会有细微的不同,看如下代码:

上面问题的出现是因为在函数中对变量进行了(+=)赋值,Python会自动认为a是一个局部变量并屏蔽了外部变量。如果把上面代码改为a = 1,就没有问题,。下面看一个list的例子:

错误5:在遍历list的同时删除其中的元素

看下面代码:

在list或数组中边遍历边删除元素,在其他编程语言中也会出现问题。幸运的是在Python中提供了list comprehensions,实现上面功能,代码修改如下:

错误6:Python的变量绑定(closure)

考虑如下代码:

希望的输出为:

实际的输出为:

出现上面问题是因为Python的延迟绑定行为,不管什么时候调用函数,i的值都是4。

解决方法如下:

上面代码有点怪,这里用的是匿名函数的默认参数。

错误7:模块的循环依赖

假设我们有两个文件a.py和b.py,它们之间相互包含:

a.py:

b.py:

我们先来导入a再来导入b:

这里没有问题,如果我们单独导入b:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注