11

在其他语言(例如 Java)中,对象引用可以是强、弱、软或幻象(http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html)。

在 Python 中,默认情况下引用是强引用,并且 WeakRef 模块允许弱引用。

是否可以在 Python 中使用“软引用”?

在我的特定情况下,我有一个创建耗时的对象缓存。有时可能没有对缓存对象的引用,但如果我不需要(即如果内存充足),我不想丢弃缓存对象。

4

2 回答 2

6

除了硬(又名强)和弱之外,Python 本身不提供任何类型的引用。

也就是说,是我大约一年前推出的一个 softref 实现,我一直在一些我需要的地方使用它。它提供的并不是真正的软引用,但它对于大多数用例来说都很接近它的边缘有点粗糙,但功能齐全......虽然它在内部依赖于一些引用计数,这意味着它可能会在除 CPython 之外的任何东西上中断。

特别是,我为创建昂贵的长寿命对象的缓存而编写了它......这SoftValueDictionary应该正是您正在寻找的东西。

于 2011-09-07T11:03:52.423 回答
0

另一种选择是使用缓存来维护一定数量的对象(例如 100 个),而不是显式计算它们的内存消耗。当一个对象被访问时,如果它存在则将它放到缓存的顶部,或者将缓存底部的对象替换为新的对象。

未经测试,但它应该在理论上有效。

于 2011-09-19T13:32:42.397 回答