Python 迭代器的成员测试

Python 迭代器的成员测试,python,iterator,Python,Iterator,有人能解释一下我下面代码最后3行中成员资格测试的行为吗?为什么它是假的? 为什么迭代器和iterables的成员资格测试不同 c = [1,2,3,4,5,6,7,8,9,10,11,12] print(3 in c) # True print(3 in c) # True d = iter(c) print(2 in d) # True print(4 in d) # True print(4 in d) # False ??? print(6 in d) # F

有人能解释一下我下面代码最后3行中成员资格测试的行为吗?为什么它是假的? 为什么迭代器和iterables的成员资格测试不同

c = [1,2,3,4,5,6,7,8,9,10,11,12]

print(3 in c)   # True
print(3 in c)   # True

d = iter(c)
print(2 in d)   # True
print(4 in d)   # True
print(4 in d)   # False  ???
print(6 in d)   # False  ???
print(10 in d)   # False  ???

因为迭代器有一个状态——在您的例子中是指向当前元素的指针

两次连续检查之间的差异

print(4 in d)   # True
print(4 in d)   # False  ???

是迭代器的状态。第一次检查后,迭代器的指针设置为4之后的下一个元素。

迭代器在使用时会被使用。我将解释你的例子:

>>> c = [1,2,3,4,5,6,7,8,9,10,11,12]
>>> d = iter(c)
>>> print(list(d))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> print(list(d))
[]
您可以将迭代器
d
视为指向列表中第一项的指针。读取其值后,它将指向第二项。当它到达末尾时,它指向一个空列表

另见:

>>> c = [1,2,3,4,5,6,7,8,9,10,11,12]
>>> d = iter(c)
>>> print(next(d))
1
>>> print(next(d))
2
>>> print(list(d))
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
检查其中是否有内容也会消耗其内容:

>>> c = [1,2,3,4,5,6,7,8,9,10,11,12]
>>> d = iter(c)
>>> 4 in d
True
>>> print(list(d))
[5, 6, 7, 8, 9, 10, 11, 12]

第二次尝试查找4后,迭代器为空,因为它遍历了所有值以查找4。在查找之后,尝试将其强制转换到列表中,看看您得到了什么,您应该得到
[]
,因此,在查找4时,它也会调用next,这会消耗迭代器。可以理解,但是对于成员资格测试和in运算符,是否应该以不同的方式实现它—在搜索迭代器中的值时不使用迭代器?@MarkoSavic迭代器只实现一件事:
next
。没有其他方法可以从中得到任何东西。这里的问题是你是否应该使用迭代器…这是一个怎样的答案?