38

我正在尝试做一些简单的事情,比如更改我正在迭代的变量 (i),但我在 Python 和 C 中都得到了不同的行为。

在 Python 中,

for i in range(10):
    print i,
    if i == 2:
        i = 4;

我得到0 1 2 3 4 5 6 7 8 9了,但在 C 中是等价的:

int i;
for (i = 0; i < 10; i++) {
    printf("%d", i);
    if (i == 2)
        i = 4;
}

我明白01256789了(请注意,数字 3 和 4 没有出现,正如预期的那样)。

这里发生了什么事?

4

6 回答 6

34

Python 在 for 循环的背景下发生了一些好事。例如:

for i in range(10):

无论如何,将不断设置i为范围中的下一个元素。0-10

如果你想在 python 中做同样的事情,你会这样做:

i = 0
while i < 10:
    print(i)
    if i == 2:
        i = 4
    else:      # these line are
        i += 1 # the correct way
    i += 1 # note that this is wrong if you want 1,2,4,5,6,7,8,9

如果您尝试将其转换为,C那么您必须记住循环中的i++infor将始终添加到i.

于 2013-04-09T13:12:20.610 回答
12

该函数range()创建一个列表。例如,range(10)将创建以下列表:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9].

当您说 时for i in range(10),首先[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]将生成所有列表,然后i按顺序分配该列表中的所有值。

更改 的值并不重要,i因为在下一次迭代中,它将被分配列表中的下一个元素。

另一方面,它是 C/C++,在每次迭代结束时,值i会递增,然后与最大允许值(在本例中为 9)进行比较,如果更大,则循环结束。

于 2013-04-09T13:13:47.463 回答
2

当您调用时,range(10)您会创建一个可迭代列表[0,1,2,3,4,5,6,7,8,9]

并且 for 循环在每一轮都从列表中一个接一个地选取一个数字,无论您是否更改了i.

于 2013-04-09T13:12:54.997 回答
1

Python 一个接一个地为您提供 中的元素range(10)。C 反复递增一个变量。

他们俩并不真正关心您对循环内的变量还做了什么,但是由于两种语言结构做的事情略有不同,因此在某些情况下结果是不同的。

于 2013-04-09T13:12:49.980 回答
1

你不能通过使用范围函数来做到这一点。您必须仅使用 while 循环来执行此操作,因为 for 循环使用范围函数,并且在范围函数中,无论您在循环中指定什么,它都将通过其内部方法递增,它只会通过范围列表递增。for i in range(10): ... print i ... if i == 2: ... i = 4 ... else: ... i += 1 ... 0 1 2 3 4 5 6 7 8 9

一个有趣的例子在这里....

for i in range(10): ... print i ... i = i + 10 ... print i ... 这将打印... 0 10 1 11 2 12 3 13 4 14 5 15 6 16 7 17 8 18 9 19

于 2013-04-09T13:46:28.463 回答
0

这是因为当您在 python 中使用 range() 函数时。您的变量 i 将通过范围内的值。例如,

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

但是,您编写的 C 语言只是使用正常条件来更改 i 的值。不涉及任何功能。

于 2013-04-09T13:15:24.977 回答