程序员老司机都要错的Python 陷阱与缺陷列表

我个人对陷阱的定义是这样的:代码看起来可以工作,但不是以你“想当然“”的方式。如果一段代码直接出错,抛出了异常,我不认为这是陷阱。比如,Python程序员应该都遇到过的“UnboundLocalError”, 示例:


> >>> a=1
> 
> >>> def func():
> 
> ...     a+=1
> 
> ...     print a
> 
> ...
> 
> >>> func()
> 
> Traceback (most recent call last):
> 
> File "<stdin>", line 1, in <module>
> 
> File "<stdin>", line 2, in func
> 
> UnboundLocalError: local variable 'a' referenced before assignment

对于“UnboundLocalError”,还有更高级的版本:


> import random
> 
> def func(ok):
> 
>     if ok:
> 
>         a = random.random()
> 
>     else:
> 
>         import random
> 
>         a = random.randint(1, 10)
> 
>     return a
> 
> func(True)# UnboundLocalError: local variable 'random' referenced before assignment
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

可能对于很多python新手来说,这个Error让人摸不着头脑。但我认为这不算陷阱,因为这段代码一定会报错,而不是默默的以错误的方式运行。不怕真小人,就怕伪君子。我认为缺陷就好比伪君子。

那么Python中哪些真正算得上陷阱呢?

第一:以mutable对象作为默认参数

这个估计是最广为人知的了,Python和其他很多语言一样,提供了默认参数,默认参数确实是个好东西,可以让函数调用者忽略一些细节(比如GUI编程,Tkinter,QT),对于lambda表达式也非常有用。但是如果使用了可变对象作为默认参数,那么事情就不那么愉快了。


> >>> def f(lst = []):
> 
> ...     lst.append(1)
> 
> ...     return lst
> 
> ...
> 
> >>> f()
> 
> [1]
> 
> >>> f()
> 
> [1, 1]

惊喜不惊喜?!究其原因,python中一切都是对象,函数也不列外,默认参数只是函数的一个属性。而默认参数在函数定义的时候已经求值了。


> Default parameter values are evaluated when the function definition is executed.

stackoverflow上有一个更适当的例子来说明默认参数是在定义的时候求值,而不
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值