osh1795   2년 전

제가 문제를 풀다가 이해 안가는 부분이 있어 질문해봅니다.

맨 처음에 리스트에 요소를 리스트로 만들고 

그 다음에 큰 리스트 내부의 작은 리스트 속 값들을 바꾸면 다른 위치에 있는 리스트들의 같은 위치들도 값이 같이 변하더라더구요.

     (말로 설명하기가 어려워 소스코드 #질문 코드 아래의 출력값을 참고해주세요.)

이 원인을 알 수 있을까요?

그리고 이 문제를 해결하는 방법을 제가 나름 생각해봤는데 이 방법 말고도 다른 방법이 있나요??

zow777   2년 전

설명에서 일부 틀린 부분이 있을 수도 있겠으나, 아는 선에서 말씀드립니다.

일단 바뀌는 이유는 lst = [[0,0,0]]*4에서 내부의 리스트([0, 0, 0])는 값에 대해 전부 같은 주소를 참조하고 있습니다.

for i in range(4)했을 때, 각 lst[i]는 개별 리스트로 생각될 수 있겠으나 실은 같은 주소를 참조하고 있는 동일한 객체입니다. 따라서 하나의 주소를 가르키고 있는 [0,0,0]이라는 값에 값을 하나 바꿨으니(수정했으니) 나머지도 똑같이 바뀌는 겁니다.

따라서 질문자님께서 의도하신대로 구현을 하시려면 lst = [[0, 0, 0] for _ in range(4)]로 쓰셔야 의도하신대로 결과가 출력될 것입니다.

리스트의 얕은 복사, 깊은 복사에 대해 검색해보시면 제가 설명 드린 것보다 정확한 답변을 얻으 실 수 있으실 겁니다.

aru0504   2년 전

list가 mutable object이기 때문에, 같은 곳을 참조합니다.

https://blog.hoony.me/34

[[0]* 3 for i in range(4)]와 같은 list comprehension을 사용하면, 서로 다른 주소를 참조하게 합니다

[[0, 0, 0]] * 4의 각 원소의 id를 확인해보세요. id(lst[0]) == id(lst[1]) == id(lst[2]) 는 True입니다

osh1795   2년 전

다들 감사합니다!! 이해했습니다~!

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