>>> a = [1,2,3] >>> b = a * 3 >>> c = [a] * 3이 주어져 있고, 이것에 관련하여 레퍼런스를 확인 하는 것이다.
첫번째로 확인하는 것은 b, c 의 차이 이다.
>>> b [1, 2, 3, 1, 2, 3, 1, 2, 3] >>> c [[1, 2, 3], [1, 2, 3], [1, 2, 3]]확인해 보면 위와 같은데, 두번째로 확인하는 문제에서 차이를 보이게 된다.
>>> a[0] = 0을 실행 해보라고 했는데, 실행 해보면
>>> b [1, 2, 3, 1, 2, 3, 1, 2, 3] >>> c [[0, 2, 3], [0, 2, 3], [0, 2, 3]]와 같이 바뀐다. 즉, c 는 리스트 내에 a의 레퍼런스가 저장 되고, 그 값이 복사 된 것이다.
그리고 b 는 객체가 복사된 것이다.
참고로 b[0] = 0 을 해보면
>>> b [0, 2, 3, 1, 2, 3, 1, 2, 3]와 같은 결과를 보인다.
세번째로 확인하는 것은
>>> c = [a[:]] * 3과의 차이를 확인해보는 것이다.
>>> a = [1,2,3] >>> c = [a[:]] * 3 >>> c [[1, 2, 3], [1, 2, 3], [1, 2, 3]]a 를 다시 정의하고 실행 해보면 맨 처음 c와 다를게 없어 보인다.
하지만 >>> a[0] = 0 을 실행 시켜 보면
>>> a[0] = 0 >>> c [[1, 2, 3], [1, 2, 3], [1, 2, 3]]와 같이 a의 변경에 의해 c가 변경 되지 않는다.
즉, c = [a[:]] * 3 은 a[:] 에 의해 생긴 새로운 객체가 리스트에 저장되고 그 값이 복사 되는 것이다.
그러나 정확히 말하면 객체가 아닌 레퍼런스가 복사 된다.
c[0][0] = 0 을 실행 시켜 보면
>>> c[0][0] = 0 >>> c [[0, 2, 3], [0, 2, 3], [0, 2, 3]]와 같이 전체가 변경 된다. 즉, 레퍼런스가 복사 된 것이다.
마지막으로 확인하는 것은 c = [a[:], a[:], a[:]] 과의 차이를 확인하는 것이다.
>>> a = [1,2,3] >>> c = [a[:], a[:], a[:]] >>> c [[1, 2, 3], [1, 2, 3], [1, 2, 3]] >>> c[0][0] = 0 >>> c [[0, 2, 3], [1, 2, 3], [1, 2, 3]]위와 같이 해보면 세번째 확인과 차이가 나타나는데, 세번째 것은 레퍼런스가 복사 되어 각 인덱스 마다 같은 객체를 가지지만 네번째 것은 서로 다른 객체를 갖게 된다.
이와 같이 리스트에 쓰는 방법에 따라서 다른 경우가 발생 한다. 참, 복잡하다...
댓글 없음:
댓글 쓰기