构造zip元素后,例如从两个列表中说,
z = zip(l1, l2)
是否有一种方法可以从
z
获取构造l1
和l2
列表的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/