在 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
我有一个小问题, 让我分享一小段代码
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