我个人对陷阱的定义是这样的:代码看起来可以工作,但不是以你“想当然“”的方式。如果一段代码直接出错,抛出了异常,我不认为这是陷阱。比如,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上有一个更适当的例子来说明默认参数是在定义的时候求值,而不