<p><a href="https://docs.python.org/3/library/functions.html#enumerate" rel="nofollow noreferrer">enumerate</a>内置函数返回一个<code>iterator</code>,一旦元素耗尽,它就会停止</p>
<p>在第一个版本中,您正在为第一个循环的每个迭代构建一个新的<code>enumerate(s)</code>,在第二个循环中,您正在使用它</p>
<p>在第二个版本中,<code>it2</code>已经完成了第一个循环的第一次迭代中的元素</p>
<pre><code>s = 'abc'
def my_enumerate(s, name):
print('a new enumerate: ', name)
for i in enumerate(s):
yield i
print(f'the enumerate {name} is exhausted ')
[(c1, c2) for j, c2 in my_enumerate(s, 'it1') for i, c1 in my_enumerate(s, 'it2')]
</code></pre>
<p>输出:</p>
<pre><code>a new enumerate: it1
a new enumerate: it2
the enumerate it2 is exhausted
a new enumerate: it2
the enumerate it2 is exhausted
a new enumerate: it2
the enumerate it2 is exhausted
the enumerate it1 is exhausted
[('a', 'a'),
('b', 'a'),
('c', 'a'),
('a', 'b'),
('b', 'b'),
('c', 'b'),
('a', 'c'),
('b', 'c'),
('c', 'c')]
</code></pre>
<p>以及:</p>
<pre><code>it1, it2 = my_enumerate(s, 'it1'), my_enumerate(s, 'it2')
[(c1, c2) for j, c2 in it1 for i, c1 in it2]
</code></pre>
<p>输出:</p>
<pre><code>a new enumerate: it1
a new enumerate: it2
the enumerate it2 is exhausted
the enumerate it1 is exhausted
[('a', 'a'), ('b', 'a'), ('c', 'a')]
</code></pre>