matthew624   2년 전

그냥 코드짜다가 이상한데서 오류가 나서 질문합니다.

입력:1

fflf 이렇게 줬을 때 

한번할때마다 좌표를 rom이라는 리스트에 저장하려고 했습니다. 예를 들어 fflf이면 (0,1)(0,2)(0,2)(-1,2) 이렇게 rom에 저장되는게 맞아야하는데 계속 

rom에는 (-1,-2)만 저장되어있습니다. pos를 append하는건데 pos를 출력하면 계속 제대로 나오는데 왜 append를 하는데 rom에 있는 값이 계속 바뀔까요..파이썬 문법중에 제가 모르는 것이 있는 것 같은데 어떤게 문제인지를 모르겠습니다. 

preview

recoma   2년 전

(제가 잘못 이해한 코드가 있어 부득이하게 이전 답변을 삭제하고 다시 올렸습니다. 양해 부탁드립니다.)

preview

파이썬에는 "id"라는 개념이 있습니다. 해당 변수의 고유 아이디 값으로 C언어의 포인터 "주소값"과 유사한 개념을 갖고 있습니다. 즉 id 값이 같으면 내용물도 일치 하다고 보시면 됩니다.

위 코드에서는 8라인에 pos를 리스트로 초기화 하고 28라인에서 반복적으로 rom에 pos를 추가하고 있습니다. 그런데 처음 초기화 한 이후로 매 반복문 마다 새로 초기화를 하지 않고 pos의 요소들만 조작하기 때문에 동일한 id 값이 rom에 올라오게 되고 이 id 값들은 하나의 리스트 값들만 보기 때문에, 출력할 때 값이 이상하게 바뀐것 처럼 보이게 됩니다.

이런 현상을 피하려면 매 반복문 마다 pos를 완전히 초기화 하셔야 합니다. 12라인에 copy()함수를 사용해서 pos의 값을 완전히 복사해야 합니다. 즉, "pos = pos.copy()"를 작성하시면 이러한 현상을 피할 수 있습니다.

id()함수는 해당 파이썬 변수(객체)의 고유 아이디를 리턴합니다. 48라인 위에, rom에 pos를 삽입하기 전에 print(id(pos))를 입력해서 id값을 보시면 같은 id값이 rom에 삽입되는 것을 보실 수가 있습니다.

matthew624   2년 전

와 정말 감사합니다 ㅠㅠㅠㅠㅠㅠ 어디가 문제인지를 몰라서 검색도 못해보고 있었습니다. 감사합니다. 포인터하니까 뭔가 감이 잡히네요!! 감사드립니다. 

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