[英]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.