안녕하세요 할게 없어서 또 쓰는 파이썬 강좌입니다.
먼저 이 내용은 초보자분들이 모를 수 있는 내용으로.
나중에 프로그래밍에 있어 큰 장애물이 될 수 있어 강의합니다.
"list" 아마 많은 분들이 사용하실 거라 생각합니다.
파이썬에서는 리스트를 복사하는 기능을 제공합니다.
하지만 여기서 문제가 발생하죠.
c 같은 컴퓨터에 가까운 언어를 배우신 분은 어느 정도 아시겠지만.
A = [1, 2, 3] B = [] B = A
이렇게 작성하게 되면 대부분은 "아, A 리스트가 B 리스트에 복사되었구나!"
라고 생각하시겠지만 사실 복사된 게 아닙니다.
우리가 리스트를 생성할 때 리스트라는 변수 여러개가 들어가있는 변수가 생성된 것이 아닙니다.
단지 주소만 들어가 있을 뿐이죠.
list 는 변수가 여러개가 들어가 있는게 아닌 그 여러개의 변수 중 0번째 칸에 있는 변수의 주소만 가지고 있는 것입나다.
그리고 우리가 리스트를 가져오면 리스트는 그 주소에 있는 값을 끄집어 옵니다.
사실 이 개념은 초보자 분들에게 상당히 낮선 개념일 겁니다.
왜냐하면 이 개념은 c의 포인터를 이해하셔야 쉽게 이해되시기 때문입니다.
다시 돌아와서 말하자면
A = [1, 2, 3] B = [] B = A
여기에서 B 에 들어간 값은 A의 주소일 뿐이라는 것입니다.
즉 우리가 A[0]의 값을 바꾸면 당연히 같은 주소인 B[0]도 바뀌게 됩니다.
이게 얕은 복사입니다.
테스트 코드:
A = [1, 2, 3] B = A print("이때 A의 값은 : " + str(A)) print("이때 B의 값은 : " + str(B)) A[0] = 10 print("이때 A의 값은 : " + str(A)) print("이때 B의 값은 : " + str(B))
그럼 이 코드의 결과는 =>
이때 A의 값은 : [1, 2, 3]
이때 B의 값은 : [1, 2, 3]
이때 A의 값은 : [10, 2, 3]
이때 B의 값은 : [10, 2, 3]
이 됩니다.. 그럼 아예 새로운 것을 복사하는 것은 어떻게 하느나?
바로 copy()를 쓰면 됩니다.
java 에서 나오는 new 랑 비슷한 겁니다.
이렇게 복사하게 되면 B의 주소를 정하고 B에 A의 값을 복사해서 넣게 됩니다.
이게 바로 깊은 복사입니다.
그럼 예제 코드:
A = [1, 2, 3] B = A print("이때 A의 값은 : " + str(A)) print("이때 B의 값은 : " + str(B)) A[0] = 10 print("이때 A의 값은 : " + str(A)) print("이때 B의 값은 : " + str(B))
실행하면:
이때 A의 값은 : [1, 2, 3]
이때 B의 값은 : [1, 2, 3]
이때 A의 값은 : [10, 2, 3]
이때 B의 값은 : [1, 2, 3]
이 됩니다.
완벽하게 복사된 것을 볼 수 있습니다.
제대로 된 이해는 할 필요 없습니다.
단지 이 내용을 알고 있단 것 만으로도
나중에 큰 버그에서 대처를 잘 할 수 있을 거라 생각합니다
그럼 ㅂㅂ
개념정리:
얕은 복사)
B = A형식의 복사 ,주소만 복사되므로 A리스트의 값이 바뀌면 B리스트의 값도 바뀜
깊은 복사)
B = A.copy() 형식의 복사, 값이 통째로 B리스트에 들어가므로 A리스트의 값이 바뀌더라도 B리스트의 값은 안 바뀜
mchang
2020.05.31어...(아직 파이썬이 뭔지도 모르는 1인)
logdev
2020.05.31어...