wallaby150   2년 전

안녕하세요 선생님들. 제가 따로 공부하고 있는 책에서 나온 문제를 풀던 중에 궁금한 것이 있어서 여쭤봅니다.

글이 길어졌는데 선요약을 하자면, 'List 항목들을 바꾼 적이 없는데, 왜 바뀌었을까?'입니다. 아래 코드의 'color_list'라고 지정한 리스트가 문제였습니다.


제가 풀고 있던 문제는 'Mastermind'라는 게임을 구현하는 프로그램을 짜는 것입니다.

이 게임의 내용은 대략 우리나라의 '숫자야구' 게임을 색깔이름으로 바꿔서 하는 것이라고 생각하시면 됩니다.

입력된 색깔 리스트 중에 랜덤 함수에 따라 4개의 리스트가 중복이 가능하게 지정되어서 이를 맞춰야 합니다.

사용자는 추론을 반복하며, 출력되는 (색상과 위치가 모두 맞은 갯수 / 색상만 맞고 위치가 틀린 갯수)를 통해 정답을 맞춰야 합니다.

그런데 제가 코드를 짜던 중에 39번 라인에서 자꾸만 오류가 발생했습니다.

살펴보니 사용자가 처음 추측을 입력한 뒤에, 지정되어 있던 정답 색깔 리스트(color_list)가 변경되는 것이 문제였습니다. 지정된 정답 색깔 리스트가 첫 추측에서 위치와 색상이 모두 맞았던 항목이 삭제되어서 39번 라인의 len함수에 오류가 생겼습니다.

ex) ['r', 'p', 'w', 'p']가 정답일 때 ['r', 'p', 'b', 'g']를 입력하면, 정답 색깔 리스트(color_list)가 ['b', 'g']로 변경됨.


제가 CL이라는 변수명으로 color_list를 복사해서, 함수 내에서 CL의 항목만 변경했음에도 color_list가 변경되는 것이 정말 이상했습니다.

해당 오류를 해결하려고 다른 이런저런 방법을 고민해보다가 몇 시간 만에 겨우 튜플을 사용해보는 방법을 통해 해결했습니다.

그런데 왜 리스트가 변경되는지 알아야 다음에도 이런 실수를 하지 않을 거 같아서 질문해보았습니다.

혼자 고민해보아도 따로 알아내기가 어려워서 처음 질문해봅니다. 부디 가르쳐주신다면 정말 감사하겠습니다!

lambda   2년 전

107번째줄에서 CL = color_list라고 해서 color_list가 복사되는 것이 아니라 CL이 가리키는 것과 color_list가 가리키는 것이 동일하게 되는 것 뿐입나다. 그래서 CL을 변경했을 때 color_list도 변경됩니다.

리스트를 복사하기 위해서는 CL=color_list[:] 처럼 슬라이싱을 이용할 수 있습니다.

구글에 'python 리스트 복사'라고 검색해보세요.

wallaby150   2년 전

늦은 시간에 관심 기울여주시고 알려주셔서 정말 감사합니다!!!

기초를 튼튼하게 다져두어야 함을 다시 한 번 느낄 수 있었네요. 좋은 밤 되세요!

댓글을 작성하려면 로그인해야 합니다.