Python for循环实现

Python for循环实现,python,for-loop,implementation,Python,For Loop,Implementation,有人能告诉我Python for循环是如何实现的吗?我问这个问题的原因是,当我期望相同的行为时,我在以下两个for循环中得到了不同的行为(假设cases只是一组元素): 第一个for循环: for case in cases: blah for i in range(len(cases)): case = cases[i] blah 第二个for循环: for case in cases: blah for i in range(len(cases)):

有人能告诉我Python for循环是如何实现的吗?我问这个问题的原因是,当我期望相同的行为时,我在以下两个for循环中得到了不同的行为(假设
cases
只是一组元素):

第一个for循环:

for case in cases:
    blah
for i in range(len(cases)):
    case = cases[i]
    blah
第二个for循环:

for case in cases:
    blah
for i in range(len(cases)):
    case = cases[i]
    blah
我正在多线程环境中运行代码


基本上,我想知道Python的for循环在集合上的迭代(如第一个for循环)是否只是第二个for循环的一种快速方式。当我们使用python for循环时,会发生什么情况?是否有任何底层优化/实现可能导致我观察到的行为差异?

否,第二种格式完全不同

for循环调用to循环序列上的
iter()
,并对结果使用
next()
调用。把它等同于:

iterable = iter(cases):
while True:
    try:
        case = next(iterable)
    except StopIteration:
        break

    # blah
对列表调用
iter()
的结果是一个列表迭代器对象:

>>> iter([])
<list_iterator object at 0x10fcc6a90>
国际热核实验堆([]) 此对象保留对原始列表的引用,并跟踪其所在的索引。该索引从0开始并递增,直到完全遍历列表为止


不同的对象可以返回具有不同行为的不同迭代器。在混合线程的情况下,您可以用其他内容替换
案例,但迭代器仍然会引用旧序列。

我没有发现任何差异,请检查下面的内容,这是您真正尝试的吗

>>> cases = [1,2,3]
>>> for case in cases:
...     print case
...
1
2
3
>>> i=0
>>> for i in range(len(cases)):
...     print cases[i]
...
1
2
3
>>>

如果
案例
实际上是一个
集合
,则第二个代码段不起作用。它是否恰好是一个
列表
?两条注释:(1)您所说的多线程环境是什么意思。您是否在Python代码中创建了多个线程?如果这是代码,请共享相同的代码。(2) 您可以在for循环中放入打印并尝试调试。您需要提供更多关于具体行为的信息,比如您在每次迭代中都试图打印case的值。@delnan抱歉,我指的是列表,而不是设置您看到的不同行为是什么?你能举个例子来说明不同的行为吗?@vishal我使用的是Scrapy,据我所知,它使用多线程。我曾考虑过将打印内容放到调试中,但我想了解python中for循环是如何工作的,所以我提出了一个问题:这里有一个奇怪的异常:一个对象带有
\uuuu getitem\uuu
,它接受
范围内的整数(0,n)参数n的
和抛出
索引器可以在没有方法的情况下迭代。我不认为任何内置类型都能做到这一点。你能澄清一下这将如何导致他获得不同的输出吗?此外,第二种方法迫使python生成一个大列表。我明白了。我怀疑差异可能在于我当时使用的对象的迭代器。这很有道理,谢谢你直截了当的回答@delnan当您希望对只有
\uuu getitem\uuuu
的对象进行迭代时,命令
iter(some\u string)
将返回一个通用迭代器,该迭代器只处理
索引器
,因此本质上异常仍然是
StopIteration