内置类型的问题——小心循环的数据结构
我们其实在之前的练习中碰到过这个概念:如果一个集合对象包含到指向自己的引用,它就被称为循环对象。当 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
类,来获取循环检测可以很重要的具体程序示例。
解决方案是知识:除非真的需要,不要使用循环引用,并确保在必须注意的程序中预料到它们。虽然有好的理由来创建循环,但除非有代码知道如何处理它们,引用自身的对象可能弊大于利。
推荐文章: