[해결] 파이썬 리스트 복사하기
글쓴이: GunSmoke / 작성시간: 월, 2008/06/16 - 4:58오후
이번에도 점프투파이썬에 대한 문의입니다.
http://wikidocs.net/mybook/read/page?pageid=40
다음 코드를 살펴보니 변수 선언만 없을 뿐 완전히 포인터로 사용하는 것 같네요.
그런데 왜 이 코드에서는 b의 값이 a와 함께 변하는데...
>>> a = [1,2,3] >>> b = a >>> a[1] = 4 >>> a [1, 4, 3] >>> b [1, 4, 3]
이렇게 a[:], 즉 리스트 a의 첫번째 요소부터 마지막 요소까지 지정하면 변하지 않는 것인가요? 'b=a'와 'b=a[:]'의 차이를 이해할 수가 없어요. 한 말씀 부탁드립니다.
>>> a = [1, 2, 3] >>> b = a[:] >>> a[1] = 4 >>> a [1, 4, 3] >>> b [1, 2, 3]
Forums:
Slice 연산은 새로운 list를 생성합니다.
a와 b는 동일한(identical) list가 아니기 때문에 같이 변하지 않는 것이죠.
저도 요즘 파이썬을
저도 요즘 파이썬을 공부하고 있습니다. ^^;
파이썬에서 변수명은 실제 변수(?)를 가리키고 있는 이름(레퍼런스)일 뿐입니다.
그래서 다음과 같은 코드는 "[1,2,3]"이 있고, a와 b는 단지 "[1,2,3]"을 가리키고 있을 뿐입니다.
따라서 "[1,2,3]"이 변경되면, a와 b는 모두 변경된 "[4,2,3]"을 가리키고 있을 뿐이죠.
그런데 슬라이싱([:])의 경우에는 새로운 변수(?)가 생성되게 됩니다.
이 경우에는 같은 값(1,2,3)을 가진 두개의 리스트("[1,2,3]")이 존재하게 됩니다.
각각의 리스트를 a와 b가 가리키고 있습니다.
따라서 a를 수정해도 b는 변경되지 않는 것입니다.
저도 이제 파이썬을 배우고 있어서,
용어나 설명이 매끄럽지 못한 부분이 많은 것 같습니다.
잘못된 용어나 내용은 지적해 주시면 감사하겠습니다.
a[:]는 a가 가리키는 리스트를 복사한 새로운 리스트를 반환합니다.
b = a를 하면, b는 a가 가리키는 [1,2,3]이라는 리스트를 가리키게 됩니다.
즉, a와 b는 동일한 리스트를 참조합니다.
따라서, 한 쪽을 바꾸면 다른 한 쪽도 바뀝니다.
하지만, b = a[:]를 하면, a가 가리키는 [1,2,3]이라는 리스트가 b로 "복사"됩니다.
즉, a와 b는 내용은 같지만, 서로 다른 리스트를 참조합니다.
(a가 가리키는 리스트가 원본이라면, b가 가리키는 리스트는 a의 복사본이라고 할 수 있습니다.)
Python의 슬라이스 연산은 원본 리스트를 복사한 새로운 리스트를 생성하여 반환하기 때문이죠.
C의 'call by value'가
C의 'call by value'가 머리에 깊이 박혀 있어서 선뜻 이해가 어려웠네요.
슬라이스 연산은 사본 리스트를 생성해서 반환한다는 정보 감사드립니다.
大逆戰
大逆戰
댓글 달기