태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

'반복자'에 해당되는 글 1건

  1. 2010.05.10 iterator invalidation (5)

iterator invalidation

Tech 2010. 5. 10. 17:08
의외로 이런 실수를 하는 사람이 꽤 많다.

numbers = range(100)
for x in numbers:
    numbers.remove(x)

이렇게 하고 나면 numbers 는 어떤 모양이 될까? 아마도 코드 작성자의 의도는 하나씩 모두 날려서 [] (빈 리스트)가 나오는거였을텐데, (내 맘대로 추측)

>>> print numbers
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
>>> 

실제로 해보면 이런 녀석이 남는다. 왜 그럴까? 참고로 - for x in numbers[:]:, 혹은 for x in list(numbers): 이렇게 for statement 를 고치면 의도대로 동작하긴 한다. 그렇다고 좋은 코드라는건 아니고 ...

무슨 언어에선가는 반복중인 컨테이너를 고치려고 하면 컴파일 타임에 알려준다고 하는 것 같았는데 ... 이런 류의 버그는 은근히 찾기가 어렵다. 간단한 (정말 기초적인) 테스트 코드 정도로도 조기 발견이 가능한 부분이고, 가능하면 테스트에서 잡히기 전에 코더의 본능이 먼저 경고해 주어야지.

그래도 STL 에는 "이 녀석은 반복자를 무효화시킵니다 ~ 조심하세요 ~" 라고 레퍼런스가 말해주긴 하는데, 파이썬 레퍼런스엔 그런 이야기가 없었던 것 같다. - 날로 읽어서 확실치는 않다.

... 사실 이건 SICP 3장이 떠올라서 주절거리는 글이다. 저 비슷한 느낌으로 스트림을 생성해가는 ㅂㅌ적인 코드들... OTL. compound but tricky 라는 느낌이랄까. 내가 수학을 못해서 그렇게 느끼는걸지도 모르지만.

아 피곤해. 두서없는 글이 되었구먼. 결론은 내가 부족하다는 거? (저건 내가 만든 버그는 아니다)

Trackbacks 0 : Comments 5
  1. Favicon of http://www.wildartist.org WILD ARTIST 2010.05.10 20:57 Modify/Delete Reply

    예전에 제가 했던 실수군요 ㅎㅎ 파이썬은 아니었지만 ㅋ
    지금 생각해보면 아련한 추억이군요 ㅋㅋ
    역시 저런 상황에서는 while문이 진리?

    • Favicon of http://deisys.net dgoon 2010.05.10 23:12 Modify/Delete

      난 그냥 새 list 만들어서 대체 -_-; 해버리는데 ... 메모리는 O(n) 이고, 속도도 O(n) ... 좀 손보면 낫겠지만, 저거 그대로 돌리면 맞는 결과가 나와도 속도가 O(n^2) OTL.

  2. Favicon of http://www.wildartist.org WILD ARTIST 2010.05.17 09:37 Modify/Delete Reply

    while len(numbers) > 0: numbers.pop()
    하지만 numbers = [] 하면 끗 ㅋㅋㅋ 새 리스트로 대체하는게 역시 짱이군요
    역시 스크립트 언어란..

    • Favicon of http://deisys.net dgoon 2010.05.17 12:15 Modify/Delete

      아... 근데 일일이 다 꺼내줘야 하는 경우도(클린업) 있긴 있어서 ㅎ

  3. Favicon of http://ad.coachfactoryoutletsv.com/ coach outlet 2013.04.01 21:49 Modify/Delete Reply

    아름다운 여자가 해바라기하는 걸 좋아해요

Write a comment