무효 클릭 IP 추적 중...
파이썬/파이썬 기초

[파이썬 기초] for loop과 remove를 이용 할때 이상하다면..?

꼬예 2021. 6. 23.
list_1 = ['하나', '둘','셋','넷','다섯']


for e in list_1:
  print(e)
  list_1.remove(e)

output :

위 코드와 같이 출력되어야할 문자들이 출력되다 마는 문제를 겪고 계신다면 이 포스팅을 참조하시기 바랍니다.

 

우리가 원하는 형태는 아마도..

 

1. ['하나', '둘', '셋', '넷', '다섯'] -> '하나' 출력 , '하나' 제거'

2. ['둘', '셋', '넷', '다섯' ] -> '둘' 출력, '둘' 제거

3. ['셋', '넷', '다섯' ] -> '셋' 출력, '셋' 제거

4. ['넷', '다섯'] -> '넷' 출력, '넷' 제거

5. ['다섯'] -> '다섯' 출력, '다섯' 제거 

 

이런식으로 다섯번 출력 되어야 할것같은데요.

 

왜 이런 문제가 발생할까요?

 

 

for 문을 돌면서 remove 가 실행 될때마다 리스트 안에 있는 값들은 하나씩 줄어드는게 맞습니다 .

 

하지만 인덱스는 리스트가 새로 갱신될때마다 새로 시작되지 않습니다. 

무슨말이냐?

 

['하나', '둘', '셋', '넷', '다섯'] 에서 '하나'를 출력한뒤 for문은 그 다음 인덱스 번호를 기준으로 출력을 합니다.

즉 '하나'가 삭제되고 남은 ['둘, '셋', '넷', '다섯']에서 '둘'을 출력하는게 아니라 다음 인덱스인 1에 위치하는 '셋'을 출력하게 되는것이죠.

 

다음도 마찬가지 입니다. '둘'을 삭제하고 남은

['셋','넷', '다섯']에서 그 다음 출력 인덱스 2에 위치하는  '다섯'을 출력하는것입니다. 

 

이제 왜 위와 같이 출력이 되는지 이해가 되시죠?

 

 

만약 우리가 원하는 식으로 코드를 실행하고 싶다면 슬라이싱을 이용한 얕은 복사를 이용하면 됩니다.

list_1 = ['하나', '둘','셋','넷','다섯']


for e in list_1[:]:
  print(e)
  list_1.remove(e)

output :

 

보시는것 처럼 for 문에 사용되는 리스트는 [:]를 이용해 리스트를 복사해서 사용하니 정상적으로 출력이 됩니다.

( 얕은 복사, 깊은 복사에 대해서 개념이 모호하신분은 해당 포스트를 참조해주세요 :) )

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글