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)
事实上,如果您没有修改列表,那么您正在创建一个新列表,然后将其分配给包含前一个列表的变量.
无论如何,当你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)
或者您在问题中显示的列表理解.