我使用奇妙的eric4 ide 编写 python 代码,它内置了一个名为“cyclops”的工具,它显然正在寻找循环。运行它后,它给了我一堆粗体红色大字母,声明我的代码中有多个循环。问题是输出几乎无法辨认,我无法通过读取它的输出来理解循环是什么。我在网上浏览了几个小时,但似乎找不到博客文章这么多。当循环堆积到某个点时,分析器和调试器停止工作:(。
我的问题是什么是循环,我怎么知道我何时制作循环,如何避免在 python 中制作循环。谢谢。
循环(或“引用循环”)是两个或多个相互引用的对象,例如:
alist = []
anoth = [alist]
alist.append(anoth)
或者
class Child(object): pass
class Parent(object): pass
c = Child()
p = Parent()
c.parent = p
p.child = c
当然,这些都是非常简单的例子,只有两个项目的循环;现实生活中的例子往往更长更难发现。没有什么灵丹妙药可以告诉你你刚刚做了一个循环——你只需要注意它。gc模块(其特定工作是垃圾收集无法访问的周期)可以帮助您诊断现有周期(当您设置适当的调试标志时)。当您确实需要(例如)孩子和父母在不创建引用循环的情况下相互了解时, weakref模块可以帮助您避免构建循环(仅将两个相互引用中的一个变成弱引用或代理,或使用模块提供的方便的弱字典容器)。
所有 Cyclops 都会告诉您代码中是否存在通过其他对象链引用自己的对象。这曾经是 python 中的一个问题,因为垃圾收集器无法正确处理这些类型的对象。从那以后,这个问题在很大程度上得到了解决。
底线:如果您没有观察到内存泄漏,那么在大多数情况下,您无需担心 Cyclops 的输出。