【问题标题】:What are cycles ? in relation to python什么是循环?关于蟒蛇
【发布时间】:2009-11-05 18:38:08
【问题描述】:

我使用奇妙的eric4 ide 编写python 代码,它内置了一个名为“cyclops”的工具,显然是在寻找循环。运行它后,它给了我一堆粗体红色大字母,声明我的代码中有多个循环。问题是输出几乎无法辨认,我无法通过读取它的输出来理解循环是什么。我在网上浏览了几个小时,似乎找不到博客文章这么多。当循环堆积到某个点时,分析器和调试器停止工作:(。

我的问题是什么是循环,我如何知道我何时制作循环,如何避免在 python 中制作循环。谢谢。

【问题讨论】:

    标签: python cycle


    【解决方案1】:

    一个循环(或“引用循环”)是两个或多个相互引用的对象,例如:

    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 模块可以帮助您避免构建循环,当您确实需要(例如)孩子和父母在不创建引用循环的情况下相互了解时(仅将两个相互引用中的一个变成弱引用或代理,或者使用模块提供的方便的弱字典容器)。

    【讨论】:

    • 谢谢 Alex,我现在明白了,再一次,weakref 是让孩子和父母知道彼此存在的唯一方法吗?
    • @spearfire,不,有很多方法——毕竟你可以决定创建一个循环;或者,您可以将所有实体放入一个字典中,每个实体都有一个唯一的键,并让其他实体将这些键保存到该字典中(仅在检查键仍然存在后使用!-)代替直接引用实体 - - 以及除此之外的许多其他方式。
    【解决方案2】:

    所有 Cyclops 都会告诉您代码中是否存在通过其他对象链引用自己的对象。这曾经是 python 中的一个问题,因为垃圾收集器无法正确处理这些类型的对象。此后,这个问题在很大程度上得到了解决。

    底线:如果您没有观察到内存泄漏,则在大多数情况下,您无需担心 Cyclops 的输出。

    【讨论】:

    • 感谢 Silas,独眼巨人是垃圾,只要我不引用引用它们的事物。
    猜你喜欢
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多