构造zip元素后,例如从两个列表中说,

z = zip(l1, l2)


是否有一种方法可以从z获取构造l1l2列表的ID,或者z完全不知道其来源?

我没有找到任何似乎相关的方法,但也许...

最佳答案

理论上在有限的情况下是可能的。如果这是获取忘记保留引用的对象的唯一方法,则可能需要在交互模式或pdb调试会话中执行类似的操作,但这不是您应该在程序中使用的方法。

让我们看一下引用zip迭代器向垃圾回收器报告的内容:

>>> import gc
>>> gc.get_referents(zip([1], [2]))
[(<list_iterator object at 0x7fcb4764dcf8>, <list_iterator object at 0x7fcb4764dbe0>), (None, None)]


我们看到对两个底层迭代器的元组和None s元组的引用。 None的元组是优化的一部分,zip用于节省分配输出元组的时间。对我们来说这没意思。 list_iterator对象更有趣,但是您要的是列表,而不是列表迭代器。

列表上的迭代器需要保留对该列表的引用,并且由于此引用可能涉及引用循环,因此列表迭代器需要在请求时将此引用报告给垃圾收集器。因此,如果再次使用gc.get_referents

>>> z = zip([1], [2])
>>> gc.get_referents(z)
[(<list_iterator object at 0x7fcb4764db70>, <list_iterator object at 0x7fcb4764dd30>), (None, None)]
>>> l_iters = _[0]
>>> gc.get_referents(l_iters[0])[0]
[1]
>>> gc.get_referents(l_iters[1])[0]
[2]


我们可以检索列表。

关于python - 追踪构成邮递区号的ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38384617/

10-12 21:46