Python:使用列表切片作为for循环的目标

时间:2018-07-21 23:36:21

标签: python python-3.x list for-loop indexing

我发现此代码段非常有趣。

a = [0, 1, 2, 3]

for a[-1] in a:
    print(a)

输出如下:

[0, 1, 2, 0]
[0, 1, 2, 1]
[0, 1, 2, 2]
[0, 1, 2, 2]

我试图了解python为什么这样做。是因为python试图重用索引吗? For循环以某种方式对列表进行切片?

我们可以在迭代列表时添加或删除元素,但是当我们尝试使用索引访问变量时,它会给出奇怪的输出。

有人可以帮助我了解列表中for循环和索引之间的交互吗?还是简单解释一下此输出?

3 个答案:

答案 0 :(得分:6)

它按预期工作。 (至少对于“预期”有一些解释。)

为此重新编写代码,以防止在任何时候对a[-1]的误解:

a = [a for a in range(0,4)]
for b in a:
    print (b)
    a[-1] = b
    print (a)

向我们展示

0
[0, 1, 2, 0]
1
[0, 1, 2, 1]
2
[0, 1, 2, 2]
2
[0, 1, 2, 2]

可以很清楚地知道,b a[-1]的分配是立即完成的,在迭代时更改列表。

四个循环执行以下操作:

  1. a[-1]被设置为列表的第一个值0。现在的结果是[0,1,2,0]
  2. a[-1]被设置为第二个值1。结果是(很明显)[0,1,2,1]
  3. a[-1]设置为2,因此结果为[0,1,2,2] –再次,只有a[-1]被更改。
  4. 最后,a[-1]被设置为a中的最后一个值,因此有效地它不会改变,最终结果为[0,1,2,2]

答案 1 :(得分:1)

a [-1]在列表中的最后一个索引a [3]中打印相同的值。编辑:有关此说明,请参见下面的评论。

结果如下:

[0, 1, 2, 0] -> same as [0, 1, 2, 3], but with a[i] (in this case, a[-1] == a[3]) is replaced with the value at a[0]
[0, 1, 2, 1] -> [0, 1, 2, 3] but a[i] is replaced with the value at a[1]
[0, 1, 2, 2] -> [0, 1, 2, 3] but a[i] is replaced with the value at a[2]
[0, 1, 2, 2] -> [0, 1, 2, 3] but a[i] is replaced with the value at a[3] from the previous iteration.

答案 2 :(得分:0)

会发生什么

         0 SETUP_LOOP              24 (to 26)
          2 LOAD_GLOBAL              0 (a)
          4 GET_ITER
    >>    6 FOR_ITER                16 (to 24)
          8 LOAD_GLOBAL              0 (a)     //ARRAY (TOS1)
         10 LOAD_CONST               2 (-1)    //DEST (TOS)
         12 STORE_SUBSCR                       //ARRAY[DEST] = TOS2*
        14 LOAD_GLOBAL              1 (print)
         16 LOAD_GLOBAL              0 (a)
         18 CALL_FUNCTION            1
         20 POP_TOP
         22 JUMP_ABSOLUTE            6
    >>   24 POP_BLOCK
    >>   26 LOAD_CONST               0 (None)
         28 RETURN_VALUE

*因此,如果有人可以弄清楚TOS2实际上是ARRAY的“访问”值?