2

我有一个文本编辑程序,可以将光标分配给程序中需要它的其他部分。光标由两部分列表组成,[start, end]每次插入/删除文本时都需要更新(开始/结束索引向前或向后移动)。

当不再使用游标时,我想停止更新它,因为有很多而且更新很耗时。不用,我的意思是请求它的对象不再引用它——它不再关心它。(例如:它有一个光标列表到所有搜索结果中的单词“bob”,并且对单词“fred”进行了新的搜索,所以现在它用一个新的光标列表替换了它的结果列表.. . 旧列表及其游标不再使用。)

我可以要求任何使用游标的对象在.finished()不再需要时调用一个方法。但如果我能检测到它何时不再被编辑器之外的任何东西引用,那会更容易。如何在 python 中检查这个(我知道垃圾清理维护一个列表,并在不再引用时将其删除)?

4

2 回答 2

6

使用模块中的弱引用weakref保存光标引用。

当弱引用的引用不再有任何强(正常)引用时,弱引用将解析为None.

>>> import weakref
>>> class Cursor: pass
... 
>>> _ = None # suppress special _ variable
>>> a = Cursor()
>>> r = weakref.ref(a)
>>> print r()
<__main__.Cursor instance at 0x1004a2bd8>
>>> del a
>>> print r()
None

您可以将所有这些弱引用放在一个集合中(或使用WeakKeyDictionaryWeakValueDictionaryWeakSet)来跟踪您必须更新的各种游标。

于 2012-10-03T01:09:23.087 回答
4

除了@nneonneo 所说的,您应该定期扫描您的光标弱引用列表并剔除Nones 否则您最终会得到一个不断增长的Nones列表

于 2012-10-03T01:12:00.557 回答