访问调试器中的迭代器对象

时间:2017-10-02 08:19:46

标签: python language-implementation

是否真的无法从for循环中访问迭代器对象或其状态?

例如,使用pdbipdb,我可以使用n一遍又一遍地循环,但不会看到我在哪个迭代中(事后,我的意思是;当然我可以使用枚举,但只能在启动调试器之前)。

def创建了一个对象,而for也是这样做的,不是吗?但该函数有一个名称 - 而迭代器没有,在内存中无法访问?那么,在不知道名字的情况下,函数是否可以在其体内访问?

(问题Python: access to iterator-object in for-loopsIterate again within the for loop的答案表明它不可能,但似乎很奇怪,我习惯于能够检查任何事情在python中。)

1 个答案:

答案 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循环通常会独立迭代。)