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

use*_*129 29 python loops list

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

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

li
["spam", "eggs"]

li = ["foo" for i in li]
li 
["foo", "foo"]
Run Code Online (Sandbox Code Playgroud)

那么,为什么我不能通过Python中的循环修改元素呢?肯定有一些我想念的东西,但我不知道是什么.我敢肯定,这是一个重复的,但我无法找到一个关于这个问题,如果有一个链接,这将是绰绰有余.先感谢您!

jus*_*alf 31

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

for idx in range(len(li)):
    i = li[idx]
    i = 'foo'
Run Code Online (Sandbox Code Playgroud)

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

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

for idx in range(len(li)):
    li[idx] = 'foo'
Run Code Online (Sandbox Code Playgroud)

或使用enumerate:

for idx, item in enumerate(li):
    li[idx] = 'foo'
Run Code Online (Sandbox Code Playgroud)


jab*_*edo 8

事实上,如果您没有修改列表,那么您正在创建一个新列表,然后将其分配给包含前一个列表的变量.

无论如何,当你for i in li得到li变量中每个值的副本时i,你没有获得对某个位置的引用li,所以你没有修改任何值li.

如果要修改列表,可以使用以下命令enumerate:

>>> li = ["spam", "eggs"]
>>> for i,_ in enumerate(li):
        li[i] = "foo"
>>> li
 ['foo', 'foo']
Run Code Online (Sandbox Code Playgroud)

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

>>> for i in xrange(len(li)):
        li[i] = "foo"
>>> li 
 ['foo', 'foo']
Run Code Online (Sandbox Code Playgroud)

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