十个Python程序员易犯的错误

不管是在学习还是工作过程中,人都会犯错。虽然Python的语法简单、灵活,但也一样存在一些不小的坑,一不小心,初学者和资深Python程序员都有可能会栽跟头。本文为大家分享了10大常见错误,需要的朋友可以参考下

常见错误1:错误地将表达式作为函数的默认参数

在Python中,我们可以为函数的某个参数设置默认值,使该参数成为可选参数。虽然这是一个很好的语言特性,但是当默认值是可变类型时,也会导致一些令人困惑的情况。我们来看看下面这个Python函数定义:

1

2

3

>>> def foo(bar=[]):    # bar是可选参数,如果没有提供bar的值,则默认为[],

...  bar.append("baz")  # 但是稍后我们会看到这行代码会出现问题。

...  return bar

Python程序员常犯的一个错误,就是想当然地认为:在每次调用函数时,如果没有为可选参数传入值,那么这个可选参数就会被设置为指定的默认值。在上面的代码中,你们可能觉得重复调用foo()函数应该会一直返回'baz',因为你们默认每次foo()函数执行时(没有指定bar变量的值),bar变量都被设置为[](也就是,一个新的空列表)。

但是,实际运行结果却是这样的:

1

2

3

4

5

6

>>> foo()

["baz"]

>>> foo()

["baz""baz"]

>>> foo()

["baz""baz""baz"]

很奇怪吧?为什么每次调用foo()函数时,都会把"baz"这个默认值添加到已有的列表中,而不是重新创建一个新的空列表呢?

答案就是,可选参数默认值的设置在Python中只会被执行一次,也就是定义该函数的时候。因此,只有当foo()函数被定义时,bar参数才会被初始化为默认值(也就是,一个空列表),但是之后每次foo()函数被调用时,都会继续使用bar参数原先初始化生成的那个列表。

当然,一个常见的解决办法就是:

1

2

3

4

5

6

7

8

9

10

11

12

>>> def foo(bar=None):

...  if bar is None:  # or if not bar:

...    bar = []

...  bar.append("baz")

...  return bar

...

>>> foo()

["baz"]

>>> foo()

["baz"]

>>> foo()

["baz"]

常见问题2:错误地使用类变量

我们来看下面这个例子:

1

2

3

4

5

6

7

8

9

10

11

>>> class A(object):

...   x = 1

...

>>> class B(A):

...   pass

...

>>> class C(A):

...   pass

...

>>> print A.x, B.x, C.x

1 1 1

这个结果很正常。

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

在Python语言中,类变量是以字典的形式进行处理的,并且遵循方法解析顺序(Method Resolution Order,MRO)。因此,在上面的代码中,由于类C中并没有x这个属性,解释器将会查找它的基类(base class,尽管Python支持多重继承,但是在这个例子中,C的基类只有A)。换句话说,C并不没有独立于A、真正属于自己的x属性。所以,引用C.x实际上就是引用了A.x。如果没有处理好这里的关系,就会导致示例中出现的这个问题。

常见错误3:错误地指定异常代码块(exception block)的参数

请看下面这段代码:

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):

 <

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值