蟒蛇。有人可以解释一下以下输出吗?

时间:2017-04-22 04:59:15

标签: python python-2.7 python-3.x logic

a = [0,1,2,3]
for a[-1] in a:
    print a[-1]

守则的输出是 0 1 2 2

怎么样?

4 个答案:

答案 0 :(得分:1)

在每次循环迭代中,下一个列表元素被分配给循环目标。这里的循环目标是a[-1]。所以循环有效地做到了:

a[-1] = a[0] # 0
print(a[-1])

a[-1] = a[1] # 1
print(a[-1])

a[-1] = a[2] # 2
print(a[-1])

请注意,此处的最后一个将a[-1]设置为2.这意味着a现在为[0, 1, 2, 2]。最后一个循环迭代现在读取最后一个值(a[3])并打印它,给出你看到的输出。

当循环目标不依赖于它的迭代时,就会出现这种奇怪现象。

答案 1 :(得分:1)

您可以将for-loop视为等效于以下内容:

next

所以你看,a[-1]a = [*0*, 1, 2, 0]返回的当前值被分配给print a[-1],这是列表的最后一个元素。

所以,


迭代1:0a = [0, *1*, 2, 1]打印print a[-1]
迭代2:1a = [0, 1, *2*, 2]打印print a[-1]
迭代3:2a = [0, 1, 2, *2*]打印print a[-1]
迭代4:2next打印Jlabel label = new JLabel("test text"); frm.add(jlab);

我已经* frm.add(label); 返回了什么。

答案 2 :(得分:1)

你可以

  

复制/粘贴您的一小段代码HERE ( pythontutor.com )

逐步了解自己会发生什么

有时候可视化的价值超过千言万语......而且,正如所有其他答案所解释的那样,当这个循环同时运行时会发生两件事情:

提供列表中的值,并使用新值更新列表本身。这就产生了惊人的输出。

答案 3 :(得分:1)

首先,a [-1]是列表a的最后一个元素。 因此,每次迭代器从列表中获取一个元素并将其分配给。

的最后一个元素
a[-1]=0 #when first loop runs
a[-1]=1 #when loop runs second time
a[-1]=2 #when loop runs third time

所以,现在你的列表是[0,1,2,2],因为当循环运行第3次时,它分配了列表的最后一个元素,值为2.

现在,当循环运行第4次和最后一次它占用最后一个元素时,将其分配给[-1],它本身是最后一个元素并打印它。因此,有效地,它打印2,这是我们列表中的最后一个元素,经过3次迭代。

这是因为您在迭代期间迭代并修改同一个对象。