为了账号安全,请及时绑定邮箱和手机立即绑定

列表值替换未按预期工作

列表值替换未按预期工作

不负相思意 2022-06-22 17:46:08
对于下面的代码L = [1, 2, 3, 4, 5]for i in L:    L[i] = 2print(L)我预计结果是[1, 2, 2, 2, 2]但是收到了[1, 2, 2, 4, 2],为什么?
查看完整描述

3 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

您的 list ( L) 值您循环时会发生变化,因此您不会访问 values 123等...,而是访问不同的值。

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

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

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

第二次迭代:( i = 2中的第二个值L),将L索引更新2为 2:

L = [1, 2, 2, 4, 5]

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

L = [1, 2, 2, 4, 5]

第四次迭代:( i = 4中的第四个值L),将L索引更新4为 2:

L = [1, 2, 2, 4, 2]

第五次/最后一次迭代:

i = 4(新的 fith 值L),将Lindex 更新4为 2(所以没有变化):

L = [1, 2, 2, 4, 2]

因此,您的结果列表如下:

[1, 2, 2, 4, 2]


查看完整回答
反对 回复 2022-06-22
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

你不应该这样做L[i]之后for i in L。为什么?

  • i表示此列表中的一个项目,而不是此列表的索引。

在您的循环中,您将每个项目用作 L 的索引,以用 2 替换它们的值。

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

  • 项目的索引号43

证明

>>> 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去寻找Return the identity of an object

您还可以看到4436993488在第二个列表中多次找到。这显示了您的替换完成的位置。

列表中的这 3 个被 2 替换,只是这个4有机会被替换。所以L[4]从来没有发生过!!


查看完整回答
反对 回复 2022-06-22
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

for i in L:

这会遍历列表中的值;即1、2、3等。


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


L[1] = 2

L[2] = 2

...

你可能想要:


for i in range(len(L)):


查看完整回答
反对 回复 2022-06-22
  • 3 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信