是否真的无法从for循环中访问迭代器对象或其状态?
例如,使用pdb
或ipdb
,我可以使用n
一遍又一遍地循环,但不会看到我在哪个迭代中(事后,我的意思是;当然我可以使用枚举,但只能在启动调试器之前)。
def
创建了一个对象,而for
也是这样做的,不是吗?但该函数有一个名称 - 而迭代器没有,在内存中无法访问?那么,在不知道名字的情况下,函数是否可以在其体内访问?
(问题Python: access to iterator-object in for-loops和Iterate again within the for loop的答案表明它不可能,但似乎很奇怪,我习惯于能够检查任何事情在python中。)
答案 0 :(得分:0)
您认为迭代器的“内部状态”应该是什么样的?
如果我正在迭代从文件读取的行,那么它将是一些文件 缓冲区和当前缓冲区中的字符位置。
如果我 迭代斐波纳契数列,它将是最后两个 用于计算下一个的值。
如果我迭代数据库查询 结果它可能是用于读取下一行的数据库游标。
如果我遍历二叉树,它将成为树中节点的指针。
如果我遍历列表,它可能只是下一个元素的索引。
Python中的迭代器没有通用的结构。某些迭代器可能会暴露其内部结构的一部分,但这可能是特定于该特定迭代器的。你可以用迭代器做的唯一事情就是在它上面调用next()
来获取下一个元素(如果没有它就是异常)。
如果您希望能够从next()
循环内部调用for
,则应该保存对迭代器的引用,所以不要使用for v in someiterable: ...
:
iterator = iter(someiterable)
for v in iterator:
... # Can refer to `v` or even call `v.next()` here ...
这是有效的,因为Python中有一个约定,即从现有迭代器构造迭代器只是为了给你现有的迭代器。因此,for
循环如果传递已经是迭代器的东西,则不会进行单独的迭代。 (比较当你给它一些只可迭代的东西时,每个for
循环通常会独立迭代。)