5장 연습 문제 4번 - 리스트의 복사

레퍼런스에 관련한 리스트 문제이다.
>>> 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]]
위와 같이 해보면 세번째 확인과 차이가 나타나는데, 세번째 것은 레퍼런스가 복사 되어 각 인덱스 마다 같은 객체를 가지지만 네번째 것은 서로 다른 객체를 갖게 된다.

이와 같이 리스트에 쓰는 방법에 따라서 다른 경우가 발생 한다. 참, 복잡하다...

댓글 없음:

댓글 쓰기