我们正在检查我们的一个包是否在 Python gc 中留下垃圾对象,并发现collections.OrderedDict
对象没有被 ref-count 机制删除,而是被放入 GC,具有以下引用(当 pprint'ing 它们并调整输出时小的):
<type 'list'> object at 0x10a876ab8:
[ <Recursive reference to list object at 0x10a876ab8>,
<Recursive reference to list object at 0x10a876ab8>,
None]
这似乎与https://bugs.python.org/issue9825中报告的问题相同。这个问题在 Python 3.2 中得到了修复,实际上,上面显示的引用循环出现在 Python 2.7 上,但没有出现在 Python 3.7 上。
collections.OrderedDict
Python 2.7是否有无参考循环的替代方案?
更新:
我发现
ordereddict.OrderedDict
也有相同的参考周期。我完全清楚 Python 2.7 已不受支持。尽管如此,我们仍然需要在 Python 2.7 上支持我们的包。
@Ramsha Siddiqui 的答案指向 Django 的 SortedDict。我验证了在 Django 1.7 中,它的 SortedDict 没有引用循环。但是,SortedDict 已从 Django 中删除(至少在其 1.11 版中)。