加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

措施员必知的Python陷阱与缺陷列表分享

发布时间:2018-08-13 23:48:44 所属栏目:教程 来源:佚名
导读:【资讯】我小我私人对陷阱的界说是这样的:代码看起来可以事变,但不是以你“想虽然“”的方法。假如一段代码直接堕落,抛出了非常,我不以为这是陷阱。 好比,Python措施员应该都碰着过的“UnboundLocalError”, 示例: a=1 def func(): ... a+=1 ... print a

  因为呈现这个陷阱的时辰常常行使了lambda,以是也许会以为是lambda的题目,但lambda暗示不肯意背这个锅。题目的本质在与python中的属性查找法则,LEGB(local,enclousing,global,bulitin),在上面的例子中,i就是在闭包浸染域(enclousing),而Python的闭包是 迟绑定 , 这意味着闭包顶用到的变量的值,是在内部函数被挪用时查询获得的。

  办理步伐也很简朴,那就是变闭包浸染域为局部浸染域。

  >>> def create_multipliers(): ... return [lambda x, i = i:i*x for i in range(5)] ...

  第七,界说__del__

  大大都计较机专业的同窗也许都是先学的C、C++,结构、析构函数的观念应该都很是熟。于是,当切换到python的时辰,天然也想知道有没有响应的函数。好比,在C++中很是著名的RAII,即通过结构、析构来打点资源(如内存、文件描写符)的声明周期。那在python中要到达同样的结果怎么做呢,即必要找到一个工具在烧毁的时辰必然会挪用的函数,于是发明白__init__, __del__函数,也许简朴写了两个例子发明晰实也能事变。但究竟上也许掉进了一个陷阱,在python documnet是有描写的:

  Circular references which are garbage are detected when the option cycle detector is enabled (it’s on by default), but can only be cleaned up if there are no Python-level __del__() methods involved.

  简朴来说,假如在轮回引用中的工具界说了__del__,那么python gc不能举办接纳,因此,存在内存走漏的风险

  第八,差异的姿势import统一个module

  示例在stackoverflow的例子上稍作修改,假设此刻有一个package叫mypackage,内里包括三个python文件:mymodule.py, main.py, __init__.py。mymodule.py代码如下:

  l = [] class A(object): pass

  main.py代码如下:

  def add(x): from mypackage import mymodule mymodule.l.append(x) print "updated list",mymodule.l, id(mymodule) def get(): import mymodule print 'module in get', id(mymodule) return mymodule.l if __name__ == '__main__': import sys sys.path.append('../') add(1) ret = get() print "lets check", ret

  运行python main.py,功效如下:

  updated list [1] 4406700752 module in get 4406700920 lets check []

  从运行功效可以看到,在add 和 get函数中import的mymodule不是统一个module,ID差异。虽然,在python2.7.10中,必要main.py的第13行才气呈现这样的结果。你也许会问,谁会写出第13行这样的代码呢?究竟上,在许多项目中,为了import的时辰利便,会往sys.path插手一堆路径。那么在项目中,各人赞成一种import方法就很是有须要了

  第九,python进级

  python3.x并不向后兼容,以是假如从2.x进级到3.x的时辰得警惕了,下面罗列两点:

  在python2.7中,range的返回值是一个列表;而在python3.x中,返回的是一个range工具。

  map()、filter()、 dict.items()在python2.7返回列表,而在3.x中返回迭代器。虽然迭代器大大都都是较量好的选择,越发pythonic,可是也有弱点,就是只能遍历一次。在instagram的分享中,也提到由于这个导致的一个坑爹的bug。

  第十,gil

  以GIL末了,由于gil是Python中各人公认的缺陷!

  从其他说话过来的同窗也许看到python用threading模块,拿过来就用,功效发明结果差池啊,然后就会喷,什么鬼。

  总结:

  毫无疑问的说,python长短常轻易上手,也很是强盛的一门说话。python很是机动,可定制化很强。同时,也存在一些陷阱,搞清晰这些陷阱可以或许更好的把握、行使这么说话。本文罗列了一些python中的一些缺陷,这是一份不完全列表,接待各人增补。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读