gpt4 book ai didi

python - 在 Python : What happens to the iterator? 中对现有迭代器使用 iter

转载 作者:太空狗 更新时间:2023-10-30 01:14:39 25 4
gpt4 key购买 nike

iter function包装列表或元组等对象,以便将它们用作迭代器,例如,可以使用 next。例如,

next(iter([1, 2, 3]))

返回 1。

如果我们传递给 iter 的对象已经是一个迭代器,内部会发生什么?它是否只是返回原始对象,即无操作?或者它会产生一个新的迭代器来包装原来的迭代器吗?当然,我所说的包装并不是指复制原始迭代器。

最佳答案

TLDNR:iter 返回 obj.__iter_。它不会“按原样”返回 obj

iter 的 Cpython 实现非常简单:

PyObject *
PyObject_GetIter(PyObject *o)
{
PyTypeObject *t = o->ob_type;
getiterfunc f = NULL;
if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
f = t->tp_iter; // <- if it has __iter__, return that
....more stuff

因此,当您调用 iter(obj) 并且 obj.__iter__ 存在时,它只会返回它。大多数(所有?)内置迭代器都有 __iter__ = self,例如

PyTypeObject PyListIter_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"listiterator", /* tp_name */
....
PyObject_SelfIter, /* tp_iter */
....

但这对于用户空间对象来说不是必需的:

class X:
def __iter__(self):
return Y()

class Y:
def __iter__(self):
return iter('xyz')


a = iter(X())
b = iter(a)
print a is b # False

关于python - 在 Python : What happens to the iterator? 中对现有迭代器使用 iter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28745043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com