【问题标题】:why here do we get 4 objects instead of 3? because I have only 3 elements in my list为什么我们在这里得到 4 个对象而不是 3 个?因为我的列表中只有 3 个元素
【发布时间】:2021-11-27 08:32:18
【问题描述】:

为什么我们在这里得到 4 个对象而不是 3 个?因为我的列表中只有 3 个元素

def special_for(iterable):
    iterator = iter(iterable)
    while True:
        try:
            # print(next(iterator))
            print(iterator)
            next(iterator)
        except(StopIteration):
            break


my_arr = [1, 2, 3]
special_for(my_arr)

输出是:

<list_iterator object at 0x107a67e50>
<list_iterator object at 0x107a67e50>
<list_iterator object at 0x107a67e50>
<list_iterator object at 0x107a67e50>

【问题讨论】:

  • print(iterator)将在next(iterator)之前执行第四次引发StopIteration错误
  • 列表包含整数并且脚本打印出相同的迭代器(参见内存中的地址 0x...)。看看当你打印出下一个迭代器的结果时会发生什么,你应该在控制台中看到整数。数组中只有三个元素,但算法在引发异常之前调用 print(iterator) 4 次,导致迭代器没有更多元素可以从可迭代对象中检索。最好使用“for e in iterator”循环语法来避免带有异常处理的构造。
  • 谢谢大家@barun

标签: python for-loop generator iterable


【解决方案1】:

脚本打印迭代器的地址而不是可迭代的元素,这是在调用next 之前完成的。然后 printnext 之前被调用四次,这将在第四次调用它时引发异常(然后迭代器被耗尽 - 指向任何内容)。查看您的控制台输出,print0x... 的形式打印出一个地址,而不是元素本身。

这是一个打印出可迭代元素的示例

def iter_and_print(iterable):
    iterator = iter(iterable)
    while True:
            try:
                    print(next(iterator))
            except StopIteration:
                    break
iter_and_print([1, 2, 3])

输出:

1
2
3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    相关资源
    最近更新 更多