内置类型的问题——小心循环的数据结构

未匹配的标注

我们其实在之前的练习中碰到过这个概念:如果一个集合对象包含到指向自己的引用,它就被称为循环对象。当Python检测到对象中的循环时,它打印 [...],而非卡在无限循环中(就像它曾经在很久前那么做过):

>>> L = ['grail'] # Append reference to same object
>>> L.append(L) # Generates cycle in object: [...]
>>> L
['grail', [...]]

除了知道方括号中的三个点表示对象中的循环外,这个例子值得理解的原因是它会导致意外的问题——如果没有预见到,循环结构可能会导致代码进入意外的循环。

比如,一些遍历结构化数据的程序必须保留已访问项目的列表、字典或set,并在即将进入可能导致不想要的循环前检查它。参见附录D中的测试知识:Part I 练习的答案来获取关于这个问题的更多信息。还请参见第19章中递归的通用讨论,还有第25章中的reloadall.py程序和第31章中的ListTree类,来获取循环检测可以很重要的具体程序示例。

解决方案是知识:除非真的需要,不要使用循环引用,并确保在必须注意的程序中预料到它们。虽然有好的理由来创建循环,但除非有代码知道如何处理它们,引用自身的对象可能弊大于利。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~