2013-07-27 5 views
0

명백한 내용이 빠져 있어야하지만이 간단한 루프가 목록 항목을 수정하지 못하는 이유는 무엇입니까?for 루프를 사용하여 목록 항목 수정

for artist in artists: 
    artist = artist.replace(': ', '') 

artists = [': Terence Trent D Arby', ": Guns N' Roses", ': Sinead O Connor' ...] 

답변

3

루프 제어 변수리스트의 요소를 참조하여 단지 로컬 변수이다. 해당 변수를 다른 오브젝트에 다시 할당하면 더 이상 원래 오브젝트를 참조하지 않습니다. 따라서 artist을 다른 객체에 할당해도 list에있는 참조가 새 객체를 가리 키지 않습니다.

원하는대로하려면 수정 된 값으로 새 목록을 만들고 원래 목록 참조에 할당 할 수 있습니다. 지능형리스트는 여기에 도움이 될 것입니다 :

artists = [artist.replace(': ', '') for artist in artists] 
+0

"문자열이 변경 불가능합니다"라고 생각하지 않습니다. – arshajii

+1

@arshajii. 그것은있다. 목록 목록이있는 경우 목록을 변경하면 목록 목록에 반영됩니다. 물론 목록 참조를 새 목록에 할당해도 목록의 목록은 변경되지 않습니다. –

+1

나는 그것을 이해하지만, OP는 이미 그가 처음에 재 할당하기 때문에 문자열의 불변성을 인정하는 것으로 보인다. 그가 예상 한 결과를 얻지 못하는 이유는 for-loop에서 루프 제어 변수를 재 할당하면 방금 설명한 바와 같이 아무 효과가 없다는 사실 때문입니다. 나는 그 질문이 실제로 무엇인지 생각합니다. – arshajii

1

다음 진술은 변경 값을 참조하기 위해 artist을 만듭니다. 이것은 목록 값을 변경하지 않습니다.

artist = artist.replace(': ', '') 

시도 다음 코드를 이용리스트 통합 :

artist = [artist.replace(': ', '') for artist in artists] 
0

Rohit 말했듯이, 작가가 목록 항목에 대한 참조가 아니므 중 하나는 IMO 가장 깨끗한 방법 인 제안, 지능형리스트를 사용하거나 당신이 할 그것은 "오래된 학교"이런 식으로, 당신이 그것을 Rohit 당신에게 준 지능형리스트 뒤에 작동 방식을 이해 만들려면 :

for index,artist in enumerate(artists): 
    artists[index] = artist.replace(': ', '') 

그러나 나는 이런 식으로 할 것이다 :

artists = [artist[2:] for artist in artists] 

만 모든 y는 경우를 ou 목록 항목은 항상 ":"로 시작합니다. 슬라이싱은 대체하는 것보다 빠를 수도 있습니다.

관련 문제