Python自我引用循环

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

输出结果为 0 1 2 2

为什么每次迭代a[-1]都会改变?


2
因为您使用它作为迭代变量,所以它会执行。 - Barmar
4个回答

6

您的代码相当于:

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

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

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

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

每次循环时,它将当前列表元素的值分配给a[-1],然后打印出来。


2

当您进行迭代时,您正在更改a[-1]的值。 迭代变量是可迭代对象中对象的引用。

lst = [[1, 2], [3, 4]]

#    ---> Iterating variable
#    |
for val in lst:
    val.append(55)
print(lst)
# [[1, 2, 55], [3, 4, 55]]

因为 a 是你正在迭代的对象的引用。

在您的情况下,您的迭代变量是 a[-1] 本身。所以,您不断地改变 a[-1]。您可以通过在此处添加 print(...) 语句来进行调试。

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

[0, 1, 2, 0] # a[-1] == a[0]
[0, 1, 2, 1] # a[-1] == a[1]
[0, 1, 2, 2] # a[-1] == a[2]
[0, 1, 2, 2] # a[-1] == a[3]

0

第一个a[-1](也就是a[3])是一个变量,你可以将从a中提取的值赋给它。在倒数第二次迭代中,它设置了a[-1] = a[2],即2。在最后一次迭代中,你提取的是a[3],它现在的值是2


0
  1. a的第一个元素是0
  2. 将a[-1]设置为该值
  3. 打印(a[-1]),结果为0
  4. a的第二个元素是1
  5. 将a[-1]设置为该值
  6. 打印(a[-1]),结果为1
  7. a的第三个元素是2
  8. 将a[-1]设置为该值
  9. 打印(a[-1]),结果为2
  10. 第四个元素是最后一个元素,在第9步中您刚刚将其设置为2。
  11. 将a[-1]设置为该值,即再次设置为2
  12. 打印(a[-1]),结果为2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接