2

我们正在检查我们的一个包是否在 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.OrderedDictPython 2.7是否有无参考循环的替代方案?

更新:

  1. 我发现ordereddict.OrderedDict也有相同的参考周期。

  2. 我完全清楚 Python 2.7 已不受支持。尽管如此,我们仍然需要在 Python 2.7 上支持我们的包。

  3. @Ramsha Siddiqui 的答案指向 Django 的 SortedDict。我验证了在 Django 1.7 中,它的 SortedDict 没有引用循环。但是,SortedDict 已从 Django 中删除(至少在其 1.11 版中)。

4

1 回答 1

-1

您可以在任何字典的项目上使用 sorted(),如下所示:

odt = dict(sorted(dt.items()))

更新:保留原始订单

如果您想保留原始顺序,也有一个 Django 库:

from django.utils.datastructures import SortedDict
d2 = SortedDict()

让我知道这是否对您的情况有帮助。

更新:[重复] 参考:Python 订购的垃圾收集字典?

del collections.OrderedDict.__del__

这似乎是获得在参考周期中使用 OrderedDicts 能力的解决方案。您将失去让 OrderedDict 在删除后立即释放其所有资源。

于 2020-02-09T08:03:39.040 回答