Python 列表值替换未按预期工作

Python 列表值替换未按预期工作,python,list,Python,List,对于以下代码 L = [1, 2, 3, 4, 5] for i in L: L[i] = 2 print(L) 我希望结果是[1,2,2,2,2] 但是收到了[1,2,2,4,2],为什么 for i in L: 这将迭代列表中的值;i、 e.1、2、3等 但是您正在使用这些值作为列表中的索引。所以结果不是你所期望的。 你基本上在做: L[1] = 2 L[2] = 2 ... 您可能想要: for i in range(len(L)): 您的列表(L)值在循环时正在更改,因此

对于以下代码

L = [1, 2, 3, 4, 5]
for i in L:
    L[i] = 2
print(L)
我希望结果是
[1,2,2,2,2]

但是收到了
[1,2,2,4,2]
,为什么

for i in L:
这将迭代列表中的;i、 e.1、2、3等

但是您正在使用这些值作为列表中的索引。所以结果不是你所期望的。 你基本上在做:

L[1] = 2
L[2] = 2
...
您可能想要:

for i in range(len(L)):
您的列表(
L
)值在循环时正在更改,因此您访问的不是值
1
2
3
等,而是不同的值

如果分解每个迭代,它可能会变得更清晰

第一次迭代:
i=1
L
中的第一个值),
L
将索引
1
更新为2(因此没有更改):

第三次迭代:
i=2
(现在是
L
中的第三个值),
L
将索引
2
更新为2(因此没有更改):

第五次/最后一次迭代:

i=4
L
中的新第五个值),
L
将索引
4
更新为2(因此没有更改):


您不应该在
之后为L中的i执行
L[i]
。为什么?

  • i
    表示此列表中的项目,而不是此列表的索引
在循环中,您使用每个项作为L的索引,用2替换它们的值

为什么
4
[1,2,2,4,2]

  • 项目
    4
    的索引号为
    3
证明

>>> L = [1, 2, 3, 4, 5]
>>> for i in L:
...     print(id(i))
...
4436993456
4436993488
4436993520
4436993552
4436993584
>>> for i in L:
...     L[i] = 2
...
>>> for i in L:
...     print(id(i))
...
4436993456
4436993488
4436993488
4436993552
4436993488
>>>
  • id
    查找
    返回对象的标识
  • 您还可以在第二个列表中多次看到
    4436993488
    。这将显示在哪里进行替换
  • 列表中的这3个被2替换,只有这
    4
    有机会被替换。所以
    L[4]
    从未发生过
在循环中添加
打印(i,L)
,您将自己看到。铅笔和纸张时间:)只需在每次迭代结束时写出数组的值即可。否,因为如果您将位置2上的元素更改为2,则此设置将始终设置为
L[2]=2
。请编辑您的问题:(1)使其具有更具体的标题;(2) 包括解释为什么你期望事情会有不同的表现。谢谢。是的,我使用列表值作为索引,但我不明白为什么L[3]是4而不是2。如果我没有弄错的话,循环应该是这样的:L[1]=2l[2]=2l[3]=2l[4]=2因为你把每个值都设置为
2
你永远不会到达
L[3]
,所以它保持不变。您总是在更改
L[1]
L[2]
L[4]
精彩的解释!现在我觉得这很有道理。我没有考虑更改后列表中的第三个值是2。非常感谢你
L = [1, 2, 2, 4, 5]
L = [1, 2, 2, 4, 5]
L = [1, 2, 2, 4, 2]
L = [1, 2, 2, 4, 2]
[1, 2, 2, 4, 2]
>>> L = [1, 2, 3, 4, 5]
>>> for i in L:
...     print(id(i))
...
4436993456
4436993488
4436993520
4436993552
4436993584
>>> for i in L:
...     L[i] = 2
...
>>> for i in L:
...     print(id(i))
...
4436993456
4436993488
4436993488
4436993552
4436993488
>>>