RPA手把手——写 Python 时要避免的十个错误

本文详细介绍了Python编程中常见的十个错误,包括错误地将表达式作为函数默认参数、错误使用类变量、异常代码块参数指定不当、变量名解析混淆、遍历列表时更改列表等,并给出了相应的解决方案和注意事项,旨在帮助Python程序员提升代码质量。
摘要由CSDN通过智能技术生成

艺赛旗 RPA9.0全新首发免费下载 点击下载

http://www.i-search.com.cn/index.html?from=line1

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

  1. >>> def foo(bar=[]): # bar是可选参数,如果没有提供bar的值,则默认为[],
  2. ... bar.append("baz") # 但是稍后我们会看到这行代码会出现问题。
  3. ... return bar
    Python 程序员常犯的一个错误,就是想当然地认为:在每次调用函数时,如果没有为可选参数传入值,那么这个可选参数就会被设置为指定的默认值。在上面的代码中,你们可能觉得重复调用 foo() 函数应该会一直返回’baz’,因为你们默认每次 foo()函数执行时(没有指定 bar变量的值), bar变量都被设置为 [](也就是,一个新的空列表)。

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

  1. >>> foo()
  2. ["baz"]
  3. >>> foo()
  4. ["baz", "baz"]
  5. >>> foo()
  6. ["baz", "baz", "baz"]
    很奇怪吧?为什么每次调用 foo()函数时,都会把 “baz” 这个默认值添加到已有的列表中,而不是重新创建一个新的空列表呢?
    答案就是,可选参数默认值的设置在 Python 中只会被执行一次,也就是定义该函数的时候。因此,只有当 foo()函数被定义时, bar参数才会被初始化为默认值(也就是,一个空列表),但是之后每次 foo()函数被调用时,都会继续使用 bar参数原先初始化生成的那个列表。

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

  1. >>> def foo(bar=None):

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

  3. ... bar = []

  4. ... bar.append("baz")

  5. ... return bar

  6. ...

  7. >>> foo()

  8. ["baz"]

  9. >>> foo()

  10. ["baz"]

  11. >>> foo()

  12. ["baz"]
    常见问题 2:错误地使用类变量
    来看下面这个例子:

  13. >>> class A(object):

  14. ... x = 1

  15. ...

  16. >>> class B(A):

  17. ... pass

  18. ...

  19. >>> class C(A):

  20. ... pass

  21. ...

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

  23. 1 1 1
    这个结果很正常。

  24. >>> B.x = 2

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

  26. 1 2 1
    嗯,结果和预计的一样。

  27. >>> A.x = 3

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

  29. 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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值