【问题标题】:Membership test for iterators迭代器的成员资格测试
【发布时间】:2018-08-11 20:50:03
【问题描述】:

有人可以解释一下我下面代码的最后 3 行中成员资格测试的行为,为什么它是 False? 为什么迭代器和可迭代对象的成员资格测试不同?

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  ???

【问题讨论】:

  • 第二次尝试查找 4 后,迭代器为空,因为它遍历所有值以查找 4。尝试在查找后将其转换为列表,看看你得到了什么,你应该获取[]

标签: python iterator


【解决方案1】:

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

两次顺序检查的区别

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

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

【讨论】:

  • 答案如何?
【解决方案2】:

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

>>> 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 时调用 next 并消耗迭代器。可以理解,但是对于成员资格测试和 in 运算符,不应该以不同的方式实现 - 不消耗迭代器,而只是在其中搜索值?
  • @MarkoSavic 迭代器只实现一件事:next。没有其他方法可以从中获得任何东西。这里的问题是您是否应该使用迭代器...
猜你喜欢
  • 2012-03-02
  • 2020-05-05
  • 1970-01-01
  • 2021-11-27
  • 2015-03-03
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多