今天我有一些空闲时间,我开始尝试使用Python。我尝试运行一段看似简单的代码:
a = []
for i in range(10):
a.append(i * ++i)
for a[i] in a:
print(a[i])
现在,正如您可能预期的那样,明显的输出应该是这样的:
0
1
4
9
16
25
36
49
64
81
但事实并非如此。当我运行它时,我所得到的是:
0
1
4
9
16
25
36
49
64
64
这是如何工作的?
答案 0 :(得分:6)
for i in range(10):
a.append(i * ++i)
Python没有++
运算符。 ++i
只是一元+
运算符两次,这是一个无操作。
for a[i] in a:
print(a[i])
这是一个非常奇怪的循环。它将for
... in
语法与索引混合在一起。循环遍历列表的典型方法是:
for item in a:
print(item)
至于为什么64用原始代码打印两次:当第一个循环结束时i
是9.第二个循环相当于:
for a[9] in a:
print(a[9])
对于列表a
中的每个元素,它将该元素分配给a
中的最后一个位置(比如说什么?),然后打印最后一个元素。这与for item in a
循环几乎相同,直到你到达终点,此时幻像的扭曲面被揭示。
因为它一直分配给a[9]
,a[9]
不保留其原始值81.当你到达结束时它被前一个值64覆盖。这就是为什么64打印两次。
答案 1 :(得分:0)
如果要打印a
,您应该执行以下操作:
for element in a:
print(element)
您的代码存在的问题是
for a[i] in a
每次循环运行时,都会覆盖a[i]
。在这种情况下i = 9
因为它来自第一个循环。因此,您的第二个循环正确打印所有内容,同时将该值分配给a[9]
这就是为什么在循环结束时您的最后一个元素再次为64
。
答案 2 :(得分:0)
让我们把它分解成碎片。
a = []
到目前为止,空列表已初始化,非常好。
for i in range(10):
a.append(i * ++i)
这里有两个错误。首先,++i
是+(+i)
,基本上不是操作。其次,在i
名称的for-loop体内进行的任何更改都将在下一次迭代中继续存在。
for o in seq
基本上是这样做的:
在每个循环开始时
a)指针递增到下一个元素
b)该元素的值已分配给o
因此,在此步骤中,在每次迭代的初始化range(10)
被要求提供下一个号码并完成i = THAT_NEXT_NUMBER
分配。
现在让我们进入第二个循环:
for a[i] in a:
print(a[i])
我们知道,第一个循环i
为9(最后一个值分配给名称i
),a
为[0, 1, 4, 9, 16, 25, 46, 49, 64, 81]
。
因为for循环基本上是"要求并分配"如上所述,一步一步的操作是:
a[i]
a[9]
,转到for循环体。列表为:[0, 1, 4, 9, 16, 25, 46, 49, 64, 0]
,打印值为a[i]
= a[9]
= 0
a[i]
a[9]
,转到for循环体。列表为:[0, 1, 4, 9, 16, 25, 46, 49, 64, 1]
,打印值为a[i]
= a[9]
= 1
a[i]
a[9]
,转到for循环体。列表为:[0, 1, 4, 9, 16, 25, 46, 49, 64, 64]
,打印值为a[i]
= a[9]
= 64
a[i]
a[9]
,转到for循环体。列表是:[0, 1, 4, 9, 16, 25, 46, 49, 64, 64]
(列表中的第9个元素被列表中的第9个元素替换),打印值为a[i]
= a[9]
= 64
。并且有结果。