所谓陷阱,也就是隐藏在表面之下,乍一看没问题,走过去会掉坑的存在。本文以 Python3 为准,介绍了部分容易掉坑的 Python 特性。
-
默认参数,这个功能使 Python 的参数列表整洁美观,但却暗藏杀机,在传递参数时疏漏也会照常运行,偶尔会导致难以排查的 bug。
-
循环引用,也就是
self.xxx = self
(一元循环)或Type A,B;A.b=B;B.a=A;
(二元循环)或Type A,B,C;A.b=B;B.c=C;C.a=A
等等,会导致内存泄漏,可以使用sys.getrefcount()
查看引用计数,可以使用gc.collect()
手动回收。
>>> class A:
... def __init__(self):
... print("A born")
... def __del__(self):
... print("A dead")
>>> class B:
... def __init__(self):
... print("B born")
... def __del__(self):
... print("B dead")
>>> a = A()
A born
>>> b = B()
B born
>>> a.b = b
>>> b.a = a
>>> gc.collect()
0
>>> del a
>>> del b
>>> gc.collect()
A dead
B dead
4
>>> gc.collect()
0
- GLOBAL 对象,GLOBAL 对象因为生命周期很长,如果它大量引用其它对象而没有及时释放,会导致内存泄漏。