第七,定义__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代码如下:
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
map()、filter()、 dict.items()在python2.7返回列表,而在3.x中返回迭代器。当然迭代器大年夜多半都是比较好的选择,加倍pythonic,然则也出缺点,就是只能遍历一次。在instagram的分享中,也提到因为这个导致的一个坑爹的bug。
运行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对象。
第十,gil

网友点评
精彩导读
科技快报
品牌展示