Can't modify list elements in a loop
Because the way for i in li
works is something like this:
for idx in range(len(li)):
i = li[idx]
i = 'foo'
So if you assign anything to i
, it won't affect li[idx]
.
The solution is either what you have proposed, or looping through the indices:
for idx in range(len(li)):
li[idx] = 'foo'
or use enumerate
:
for idx, item in enumerate(li):
li[idx] = 'foo'
In fact with list comprehension you are not modifying the list, you are creating a new list and then assigning it to the variable that contained the previous one.
Anyway, when you do for i in li
you are getting a copy of each value of li
in variable i
, you don't get the reference to a position in li
, so you are not modifying any value in li
.
If you want to modify your list you can do it with enumerate
:
>>> li = ["spam", "eggs"]
>>> for i,_ in enumerate(li):
li[i] = "foo"
>>> li
['foo', 'foo']
or with xrange
(in Python 2.7, use range in python 3):
>>> for i in xrange(len(li)):
li[i] = "foo"
>>> li
['foo', 'foo']
or with the list comprehension you showed in your question.