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

2024-04-26 22:24:49 发布

您现在位置: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

这是怎么回事?你知道吗


Tags: 代码infor时间range空闲事实print
3条回答

我们把它拆成碎片吧。你知道吗

a = []

空名单初始化,到目前为止,还不错。你知道吗

for i in range(10):
    a.append(i * ++i)

这里有两个错误。首先,++i+(+i),这本质上不是操作。其次,在for循环体中对i名称所做的任何更改都不会保留到下一次迭代。你知道吗

for o in seq本质上是这样的:

  1. 指针被保存在内部,这是它跟踪迭代中当前“活动”成员的地方
  2. 在每个循环开始时

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

    b)该元素的值被赋给o

所以在这一步中,在每次迭代的开始时range(10)被要求输入下一个数字,并且i = THAT_NEXT_NUMBER赋值被完成。你知道吗

现在让我们进入第二个怪圈:

for a[i] in a:
    print(a[i])

我们知道在第一个循环之后i是9(最后一个赋值给name i),而a[0, 1, 4, 9, 16, 25, 46, 49, 64, 81]。你知道吗

由于for循环本质上是上面描述的“ask and assign”,因此逐步操作是:

  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. Ask list for最后一个元素,将其分配给a[i],即a[9],转到for循环体。列表为:[0, 1, 4, 9, 16, 25, 46, 49, 64, 64](列表中的第9个元素替换为列表中的第9个元素),打印值为a[i]=a[9]=64。你知道吗

这就是你的结果。你知道吗

当您想打印a时,您应该:

for element in a:
    print(element)

你的代码的问题是

for a[i] in a

每次循环运行时覆盖a[i]i = 9因为它来自第一个循环。因此,第二个循环正确地打印所有内容,同时将该值赋给a[9]这就是为什么在循环结束时,最后一个元素又是64。你知道吗

for i in range(10):
    a.append(i * ++i)

Python没有++操作符。++i只是一元+运算符的两倍,这是不可操作的

for a[i] in a:
    print(a[i])

这真是个奇怪的循环。它把forin语法和索引混为一谈。循环浏览列表的典型方法是:

for item in a:
    print(item)

至于为什么用原始代码打印两次64:when the first loop finishedi是9。因此,第二个循环相当于:

for a[9] in a:
    print(a[9])

对于列表a中的每个元素,它将该元素分配到a中的最后一个位置(比如说什么?),然后打印最后一个元素。它的工作原理与for item in a循环基本相同,直到到达终点,这时幻影扭曲的脸才显露出来。你知道吗

因为它一直被赋值给a[9]a[9]并没有保留它原来的值81。当你到达终点时,它被上一个值64覆盖了。这就是为什么64要打印两次。你知道吗

相关问题 更多 >