Python 有关enumerate函数、list函数、for循环的总和应用问题

老张
  • 3
新手上路,请多包涵

各位大大好,兄弟小白自学python,现遇到一个问题,网上搜索不到相关解答,故来求助,谢过!
先把问题列出:
1、为何1和3没变化的情况下,4却没有输出内容。但把print(list(a), 22222222)这句删掉,4就可以发挥作用。求解这是什么原理,我理解a从同到尾都没有变化才对,为何for循环中的内容貌似蒸发了一样呢?
2、输出内容555说明了a在该位置并没有任何变化,但为何6和7却输出了空列表。。。。

代码如下:
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
a = enumerate(seasons)
print(a, 11111111111)
print(list(a), 22222222)
print(a, 33333333)

for i, element in a:

print(i, element, 4444444444)

print(a, 55555555)
print(list(a), 66666)
b = list(a)
print(b, 7777777)

输出结果:
<enumerate object at 0x0000011B2D8DEF00> 11111111111
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] 22222222
<enumerate object at 0x0000011B2D8DEF00> 33333333
<enumerate object at 0x0000011B2D8DEF00> 55555555
[] 66666
[] 7777777

回复
阅读 690
2 个回答

原理同上面的回答, 估计lz看的也是懵的. 简单的解释是迭代器相当于是一个队列. 里面数据是一次性的, 遍历的时候按顺序拿数据, 遍历完了数据就没了. 你的a在前面list(a)的时候已经遍历过一次了, 里面已经没数据了, 后面再遍历就没数据了自然为空. 但是这个迭代器依旧是同一个迭代器, 只是里面没有数据了.

enumerate 返回一个迭代器 iterator,迭代器是会随着 __next__ 的调用改变内部状态的。

a = enumerate(seasons) 这一行代码调用的时候创建了迭代器 a ,此时迭代器的位置是 seasons[0]next(a) 返回 seasons[0] 并且把迭代器内部的状态调整到 seasons[1]

list(a) 这个调用,会提取迭代器里所有元素,迭代器本身的状态会迁移到 seasons[len(seasons)],也就是下一个 next(a) 不会返回任何元素了,所以 for i,e in a: 看起来完全没执行。

参考阅读

迭代器 iterator
iter()
next()
StopIteration
enumerate()

宣传栏