Python:通过for循环更改列表

标签 python

<分区>

我又来问你另一个基本问题了。 :) 我想通过 for-loop 更改列表。(抱歉打扰,但我是新手....)

这是第一个脚本:

L=[1,2,3]
i=0
for a in L:
    L[i]+=1
    i+=1
print(L)
print(a)

我得到了:

L:[2,3,4]
a: 3

这正是我想要的。 但我注意到,如果我将脚本更改为:

L=[1,2,3]
for i in L:
    i+=1
print(L)
print(i)

我得到了:

L:[1,2,3]
i:4

我能理解 i 必须是 4。但问题是为什么列表 L 没有改变。在我看来,列表中的对象被赋予了变量i。所以变量 i 是可以编辑对象的人。所以基本上,列表应该改变。然而,实际上,它保持不变。

谁能解释一下?

谢谢!

最佳答案

这与 Python“变量”的真正含义有关:指向对象的名称。可以把它想象成一个字典,名称作为键,对象作为值。

在你的for循环中,i最初指向列表中的当前迭代项,即i指向L[ 0],然后到 L[1] 等。但是当您执行 i += 1 - 实际上转换为 i = i+1 - 你重新绑定(bind) i 以便它指向另一个对象。这只会影响 name i(键持有什么值),而不是它之前指向的对象,所以你的列表确实没有改变。

更深入的解释,你想阅读Ned Batchelder's excellent article .这将为您节省很多时间和挫折;)

注意:对于您的示例片段,更新列表的正确方法是使用 enumerate:

for index, value in enumerate(L):
    L[index] = value + 1

或者用列表理解更新整个列表:

L[:] = [value+1 for value in L]

关于Python:通过for循环更改列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50986441/

相关文章:

python - 在 tqdm 中将 "processing"更改为 "processed"

python - 用 Python 制作收银机

python - 导入错误:没有名为 cStringIO 的模块

python - ManyToManyField 通过抽象模型

python - 如何校正和识别图像中的短文本

Python sql语句错误

python - 在 Azure Web Apps 中设置 Python 服务器

python - 通过多个变量的模糊匹配来匹配实体

python - 如何在Python中使用正则表达式从数据集中提取数据?

python - 将二维列表和一维列表映射到字典