파이썬에서 for문 안의 리스트가 왜 순서대로 항목을 가져오지 않을까요?

조회수 957회
#Write your function here
def delete_starting_evens(lst):
  lst_temp = lst
  print("--------------")
  print(lst,"lst")
  print(lst_temp,"lst_temp")
  for i in lst:
    print (i,"number")
    if i%2 ==0:
      print(i,"even")
      print(lst_temp.pop(0))
    else:
      print(i,"odd")
      break
  return lst_temp

#Uncomment the lines below when your function is done
print(delete_starting_evens([4, 8, 10, 11, 12, 15]))
print(delete_starting_evens([4, 8, 10]))
--결과--
[4, 8, 10, 11, 12, 15] lst
[4, 8, 10, 11, 12, 15] lst_temp
4 number
4 even
4
10 number
10 even
8
12 number
12 even
10
[11, 12, 15]
--------------
[4, 8, 10] lst
[4, 8, 10] lst_temp
4 number
4 even
4
10 number
10 even
8
[10]

위 코드를 돌리면 [4, 8, 10, 11, 12, 15] lst에서 i가 4,8,10으로 가지 않고 4에서 10으로 바로 건너뜁니다. pop(0)을 실행한 건 lst_temp인데 말이죠. 그리고 11에서는 11 odds 가 출력되지 않습니다. 전체적으로 코드 실행 결과가 이해되지 않는데 제가 어딜 잘못한걸까요? 왜그럴까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • lst_temp = lst
    해당 구문은 lst 리스트를 복사하는 것이 아니라 lst가 가지고 있는 (메모리 어딘가 존재하는) 리스트의 주소를 lst_temp에 복사하는 것입니다.
    (이것을 참조(레퍼런스)라고 부릅니다.)
    때문에 lst_temp의 조작은 lst에서도 볼 수 있게 됩니다.
    이제 왜 저러한 결과가 나타나는지 아시겠죠?

    그럼 주소가 아니라 실제로 리스트를 복사하고 싶다면 아래의 방법들을 사용하실 수 있습니다.

    lst_temp = lst[:]
    lst_temp = list(lst)
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 리스트 = 리스트를 하면 값 복사가 아니라 그랬군요 감사합니다! 알 수 없는 사용자 2019.1.9 01:08

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)