2013-10-10 3 views
19

목록에서 파이썬으로 루핑하는 동안 목록 이해없이 요소를 수정할 수 없었습니다. 참고로 :루프의 목록 요소를 수정할 수 없습니다. Python

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

li 
["spam", "eggs"] 

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

그럼, 왜 내가 파이썬에서 루프를 통해 요소를 수정할 수 없습니다? 분명히 내가 빠진 것이 있지만, 나는 무엇을 모르겠습니다. 이것이 중복 된 것이라고 확신하지만, 이것에 관한 질문을 찾을 수 없었습니다. 링크가 있다면 충분할 것입니다. 미리 감사드립니다. 작동 for i in li 방법이 같은이기 때문에

+3

페이지의 [이] (http://stackoverflow.com/questions/4081217/how-to-modify-list-entries-during-for-loop), [이] (HTTP : // 유래. com/questions/1637807/modify-list-while-iterating) – devnull

답변

21

: 당신이 i 아무것도를 할당하는 경우

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

그래서, li[idx]에 영향을 미치지 않습니다.

이 솔루션은 하나 당신이 제안, 또는 인덱스를 통해 반복 한 무엇 :

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

또는 사용 enumerate :

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

인덱스를 반복하는 것이 저에게 효과가있는 것 같지 않습니다. 파이썬 3.6을 사용하고 있습니다. 신경 쓰지 마. 슬라이스를 사용하고 있습니다. – Valachio

8

목록 이해와 사실 당신이 목록을 수정하지 않는 경우 새 목록을 만든 다음 이전 목록을 포함하는 변수에 할당합니다. 당신이 변수 ili의 각 값의 사본을 얻고있다 for i in li을 할 때 li에 어떤 값을 수정되지 않도록

어쨌든, 당신은, li의 위치에 대한 참조를하지 않습니다. 당신이 당신의 목록을 수정하려면

당신은 enumerate으로 작업을 수행 할 수 있습니다

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

또는 xrange로를 (파이썬 2.7, 파이썬 3에서 범위를 사용) :

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

또는과를 질문에서 보여준 목록 이해력. 반복하면서

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] 
1

for element in li이 - 당신 요소의 사본이 아닌 요소 자체를 반환합니다. 귀하의 경우에 대한

솔루션은 다음과 같습니다

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

아마 사용하여 사전 도움이 될 수 있습니다.

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

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