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

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

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

목차

    list_1 = ['하나', '둘','셋','넷','다섯']
    
    
    for e in list_1:
      print(e)
      list_1.remove(e)

    output :

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

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

     

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

     

    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 loop과 remove를 이용 할때 이상하다면..?

     

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

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

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

    댓글

    꼬예님의
    글이 좋았다면 응원을 보내주세요!