在Python中看起来像其他东西的输出

时间:2016-05-27 19:49:17

标签: python

今天我有一些空闲时间,我开始尝试使用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

这是如何工作的?

3 个答案:

答案 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基本上是这样做的:

  1. 指针保留在内部,这是它跟踪当前"活动"迭代成员
  2. 在每个循环开始时

    a)指针递增到下一个元素

    b)该元素的值已分配给o

  3. 因此,在此步骤中,在每次迭代的初始化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循环基本上是"要求并分配"如上所述,一步一步的操作是:

    1. 询问第一个元素的列表,将其分配给a[i] a[9],转到for循环体。列表为:[0, 1, 4, 9, 16, 25, 46, 49, 64, 0],打印值为a[i] = a[9] = 0
    2. 询问第二个元素的列表,将其分配给a[i] a[9],转到for循环体。列表为:[0, 1, 4, 9, 16, 25, 46, 49, 64, 1],打印值为a[i] = a[9] = 1
      1. 询问列表倒数第二个元素,将其分配给a[i] a[9],转到for循环体。列表为:[0, 1, 4, 9, 16, 25, 46, 49, 64, 64],打印值为a[i] = a[9] = 64
      2. 询问列表forlast元素,将其分配给a[i] a[9],转到for循环体。列表是:[0, 1, 4, 9, 16, 25, 46, 49, 64, 64](列表中的第9个元素被列表中的第9个元素替换),打印值为a[i] = a[9] = 64
      3. 并且有结果。