无法修改循环Python中的列表元素

时间:2013-10-10 08:29:52

标签: python list loops

在Python中循环遍历列表时,我无法在没有列表推导的情况下修改元素。 供参考:

li = ["spam", "eggs"]
for i in li:
    i = "foo"

li
["spam", "eggs"]

li = ["foo" for i in li]
li 
["foo", "foo"]

那么,为什么我不能通过Python中的循环修改元素?肯定有一些我想念的东西,但我不知道是什么。我确定这是重复的,但是我找不到关于这个的问题,如果有链接,那就足够了。提前谢谢!

5 个答案:

答案 0 :(得分:28)

因为for i in li的工作方式是这样的:

for idx in range(len(li)):
    i = li[idx]
    i = 'foo'

因此,如果您向i分配任何内容,则不会影响li[idx]

解决方案是您提出的建议,或循环索引:

for idx in range(len(li)):
    li[idx] = 'foo'

或使用enumerate

for idx, item in enumerate(li):
    li[idx] = 'foo'

答案 1 :(得分:8)

事实上,对于列表理解,您没有修改列表,您正在创建一个新列表,然后将其分配给包含前一个列表的变量。

无论如何,当您执行for i in li时,您会在变量li中获得i的每个值的副本,但您无法获得li中某个位置的引用},所以你没有修改li中的任何值。

如果您想修改列表,可以使用enumerate

进行修改
>>> li = ["spam", "eggs"]
>>> for i,_ in enumerate(li):
        li[i] = "foo"
>>> li
 ['foo', 'foo']

或使用xrange(在Python 2.7中,在python 3中使用范围):

>>> for i in xrange(len(li)):
        li[i] = "foo"
>>> li 
 ['foo', 'foo']

或您在问题中显示的列表理解。

答案 2 :(得分:1)

我可以在循环时修改列表:

lst = range(10)  // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

for i, elem in enumerate(lst):
    lst[i] = 0   // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

答案 3 :(得分:1)

也许使用字典可能会有所帮助。

>>> li = {0: "spam", 1:"eggs"}
    for k, v in li.iteritems():
        li[k] = "foo"

>>> li
{0: 'foo', 1: 'foo'}

答案 4 :(得分:0)

for element in li - 返回元素的副本,而不是元素本身。

您案件的解决方案是:

for i in range(len(li)):
    li[i] = 'foo'