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

普拉纳夫

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

num = [1, 2, 3, 4]

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

这里的输出是

1
2
5
4

迭代器的值在第三次迭代中更新为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中观察到了这一点)

高贵

运行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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章