Python 类列表迭代器定义在哪里?

Python 类列表迭代器定义在哪里?,python,python-3.x,iterator,Python,Python 3.x,Iterator,我想看看类list\u迭代器的定义。当我试图用函数help显示它的定义时,我得到一个错误。是否有我必须导入的模块才能访问其帮助 更准确地说,我想知道如何获得对迭代器迭代的对象iterable的引用。例如: l = [1,2,3,4,5] it = iter(l) print(type(it)) # this prints: list_iterator # how to get a reference to l using it 我很确定对象它引用了对象l。这个例子证明了这一点: impor

我想看看类
list\u迭代器的定义。当我试图用函数
help
显示它的定义时,我得到一个错误。是否有我必须导入的模块才能访问其帮助

更准确地说,我想知道如何获得对迭代器迭代的对象iterable的引用。例如:

l = [1,2,3,4,5]
it = iter(l)
print(type(it))   # this prints: list_iterator
# how to get a reference to l using it
我很确定对象
引用了对象
l
。这个例子证明了这一点:

import sys
l = [1,2,3,4]
print(sys.getrefcount(l))   # prints 2
it = iter(l)
print(sys.getrefcount(l))   # prints 3 
所以第三个参考肯定来自
it

垃圾收集为您做了吗

import gc

l = [1,2,3,4,5]
it = iter(l)

refs = gc.get_referents(it)  # looks like: [[1, 2, 3, 4, 5]]
assert l in refs  # True
assert l == refs[0]  # True
编辑:应该注意的是,当
l
耗尽并引发
StopIteration
时,对
l
的引用将消失。因此,当您完成对
it
的迭代时,上面的引用检查将失败。这可能是一个特性,也可能是一个bug,这取决于您的用例,但您应该意识到这一点

# Exhaust the iterator
for x in it:
    pass

refs = gc.get_referents(it)
assert l not in refs  # No more reference to l
assert not refs  # No more reference to anything actually

我不认为
it
一定会引用
l
。当它在C级退出时,它可以绕过
列表
对象直接访问存储数据的数组。(我不确定
list\u迭代器
甚至是由Python定义的;它可能是CPython的一个实现细节。)@chepner
t
确实引用了
l
。见我的更新。来源是:如何黑客/不可移植的解决方案足够好
it.\uu reduce\uu()[1][0]
在当前的CPython中是这样做的,但这不是我想要依赖的东西。我应该更清楚一点:我不认为
it
在语言层面上暴露了它的引用(马克的评论毫无保留;我从来都不清楚
\uu reduce\uu
到底做了什么)。聪明。非常有趣的想法。谢谢你的回答!非常聪明。一般来说,用
get\u referents
窥视对象的引用是一件危险的事情。大多数Python C代码的编写都假设您无法访问引用
get_referents
exposes,并且无论如何访问这些引用都会导致内存损坏和任意奇怪的结果。@user2357112supportsMonica hmmm我不知道窥视引用会导致内存问题。我知道这不是很好的练习,但不知道这很危险。你有关于这个的链接吗?我不是怀疑,只是好奇。@BrianJoseph:只读访问可能不会做什么坏事,尽管它在理论上是不安全的。不过,除此之外的任何事情都可能很快变得非常糟糕。