python输入列表有缺陷_程序员老司机们都要错的Python陷阱与缺陷列表

本文探讨了Python编程中的一些常见陷阱和缺陷,包括以可变对象作为默认参数、x += y与x = x + y的区别、元组的单元素陷阱、创建列表的列表时的误解、在遍历列表时修改列表、闭包与lambda函数的行为、定义__del__的潜在风险、导入模块的不同方式导致的问题、Python升级带来的不兼容性,以及Python的全局解释器锁(GIL)问题。理解这些陷阱有助于提高Python编程的效率和质量。
摘要由CSDN通过智能技术生成

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

>>> a=1

>>> def func():

...     a+=1

...     print a

...

>>> func()

Traceback (most recent call last):

File "", line 1,in

File "", line 2,infunc

UnboundLocalError: localvariable'a'referenced before assignment

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

import random

def func(ok):

if ok:

a = random.random()

else:

import random

a = random.randint(1, 10)

returna

func(True)# UnboundLocalError:localvariable'random'referenced before assignment

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

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

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

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

>>> def f(lst = []):

...     lst.append(1)

...     returnlst

...

>>> f()

[1]

>>> f()

[1, 1]

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

Defaultparametervaluesare evaluatedwhenthefunctiondefinitionisexecuted.

stackoverflow上有一个更适当的例子来说明默认参数是在定义的时候求值,而不是调用的时候。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值