繁体   English   中英

为什么 Python for 循环不像 C for 循环那样工作?

[英]Why Python for loop doesn't work like C for loop?

C:

# include <stdio.h>
main()
{
    int i;
    for (i=0; i<10; i++)
    {
           if (i>5) 
           {
             i=i-1;     
             printf("%d",i);
           } 
    }
}

Python:

for i in range(10):
   if i>5: i=i-1
   print(i)

当我们编译 C 代码时,它会进入一个无限循环,永远打印 5,而在 Python 中则不会,为什么不呢?

Python输出是:

0 1 2 3 4 5 5 6 7 8

在 Python 中,循环不会增加i ,而是从可迭代对象(在本例中为列表)中为其分配值。 因此,在 for 循环内更改i不会“混淆”循环,因为在下一次迭代中, i将被简单地分配下一个值。

在您提供的代码中,当i为 6 时,它会在循环中递减,以便将其更改为 5 然后打印。 在下一次迭代中,Python 只是将其设置为列表[0,1,2,3,4,5,6,7,8,9]的下一个值,即 7,依此类推。 当没有更多值可取时,循环终止。

当然,你提供的C循环中得到的效果在Python中还是可以实现的。 由于每个 for 循环都是一个美化的 while 循环,从某种意义上说,它可以像这样转换:

for (init; condition; term) ...

相当于:

init
while(condition) {
    ...
    term
}

那么你的 for 无限循环可以用 Python 编写为:

i = 0
while i < 10:
    if i > 5:
        i -= 1
    print i
    i += 1

这两个结构都被称为 for 循环,但它们实际上不是一回事。

Python 的版本实际上是一个 foreach 循环。 它为集合中的每个元素运行一次。 range(10)产生一个类似[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]所以 for 循环对集合的每个成员运行一次。 它不使用i的值来决定下一个元素是什么,它总是采用列表中的下一个元素。

c for 循环被翻译成等价于

int i = 0
while i < 10:
   ...
   i++;

这就是为什么你可以操纵i

因为你的两个例子是完全不同的东西。

python 中的range(10)生成值 0 - 9 的列表,然后for i in将每个返回为i 这通常称为“for-each”循环。 当您在 python 示例中说i=i-1时,您正在操作一个值,而不是迭代器。

http://docs.python.org/tutorial/controlflow.html

Python 中的for语句与您可能在 C 或 Pascal 中使用的语句略有不同。 Python 的 for 语句不是总是迭代数字的等差数列(如在 Pascal 中),也不是让用户能够定义迭代步骤和停止条件(如 C),而是迭代任何序列(列表或一个字符串),按照它们在序列中出现的顺序。 例如(没有双关语意):

a = ['cat', 'window', 'defenestrate']
for x in a:
    print x, len(x)

修改循环中迭代的序列是不安全的(这只会发生在可变序列类型,例如列表)。 如果您需要修改您正在迭代的列表(例如,复制选定的项目),您必须迭代一个副本。

当然 range 生成的序列是不可变的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM