考虑下面的例子:
s = 'abc'
[(c1, c2) for j, c2 in enumerate(s) for i, c1 in enumerate(s)]
输出:
[('a', 'a'),
('b', 'a'),
('c', 'a'),
('a', 'b'),
('b', 'b'),
('c', 'b'),
('a', 'c'),
('b', 'c'),
('c', 'c')]
如果在列表理解之外调用enumerate,并且将迭代器分配给变量,我希望得到相同的输出:
it1, it2 = enumerate(s), enumerate(s)
[(c1, c2) for j, c2 in it1 for i, c1 in it2]
但我得到:
[('a', 'a'), ('b', 'a'), ('c', 'a')]
发生了什么事?我使用Python 3.6.9
发生的情况是,内部迭代器在外部迭代器的第一次迭代后耗尽:
相比之下:
如果需要持久性,请将其括在
list
或tuple
中:尽管如此,请注意多次使用
enumerate()
与将其封装在list
或tuple
中的内存占用情况不同enumerate内置函数返回一个
iterator
,一旦元素耗尽,它就会停止在第一个版本中,您正在为第一个循环的每个迭代构建一个新的
enumerate(s)
,在第二个循环中,您正在使用它在第二个版本中,
it2
已经完成了第一个循环的第一次迭代中的元素输出:
以及:
输出:
区别在于:
为第一个
for
上生成的每个值创建一个新的c1
枚举数。在第二个示例中,使用了相同的枚举数(it2)——当第一个for
进入下一个迭代(c2=“b”)并尝试迭代“it2”时,它会在到达“c”时被检查——并且整个表达式结束相关问题 更多 >
编程相关推荐