在 python 中遍历列表时观察到奇怪的行为

Strange behavior observed when iterating over list in python

我有一个小问题, 让我分享一小段代码

num = [1, 2, 3, 4]

for i in num:
    print(i)
    num[2] = 5

这里的输出是

1
2
5
4

迭代器的值在第 3 次迭代中更新为 5 而不是 3,现在如果我这样做

num = [1, 2, 3, 4]

for i in num:
    print(i)
    num = [5 if j == 3 else j for j in num]

输出是

1
2
3
4

迭代器在第三次迭代中保持不变 有谁知道这种行为的原因? (我在 Python 3.8 或 2.7 中观察到这一点)

在您的第一个代码中,您的 num[2]=5 替换了第一个循环实例本身中的值,因此在正常循环中打印了 5。

您的第二个密码:

实际上是在替换,第二个代码中只打印了i

您需要打印num来检查替换值。

代码:

num = [1, 2, 3, 4]

for i in num:
    print(i)
    num = [5 if j==3 else j for j in num ]
    
print (num)# This line

输出:

1
2
3
4
[1, 2, 5, 4]

for 循环已经获取了 num 的迭代器,而在循环内部修改了 num,那么 for 循环不再查找 num,并使用旧列表进行迭代。

当您 运行 for 循环时,它获取所提供对象的 ID 并对其进行迭代。

在第一个代码片段中,您正在更改原始对象的一个​​元素,因此当迭代器到达第二个元素时,它采用更新后的值。

然而,在第二种情况下,您正在创建一个具有不同值的新对象,但您提供给循环的对象保持不变。

检查此行为的一种方法是获取修改前后变量的 id,并查看它在第一种情况下如何没有改变但在第二种情况下如何改变:

my_list = [1, 2, 3]
original_id = id(my_list)

# Check if the object identification changes after modifying one element
my_list[2] = 4
new_id = id(my_list)
if original_id == new_id:
   print("1st case: The ID stays the same")
else:
   print("1st case: The ID has changed")

# Check now what happens if you create a new list
my_list = [3, 2, 1]
new_id = id(my_list)
if original_id == new_id:
   print("2nd case: The ID stays the same")
else:
   print("2nd case: The ID has changed")

得到的结果如下:

1st case: The ID stays the same
2nd case: The ID has changed