개인 자료란 (JE)

  서버 커뮤니티

Profile logdev 대표칭호 없음
Profile

python

파이썬 얕은 복사, 깊은 복사

2020.05.31 조회 수 121 추천 수 0

안녕하세요 할게 없어서 또 쓰는 파이썬 강좌입니다.


먼저 이 내용은 초보자분들이 모를 수 있는 내용으로.


나중에 프로그래밍에 있어 큰 장애물이 될 수 있어 강의합니다.


"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리스트의 값은 안 바뀜

2개의 댓글

mchang
2020.05.31

어...(아직 파이썬이 뭔지도 모르는 1인)

logdev
2020.05.31
@mchang

어...

뉴스 및 창작물
/files/thumbnails/477/930/003/262x150.crop.jpg?20241201030912

레드스톤

뉴진스 - Super Shy | 마크 노트블럭 커버

노트블럭전문가

2024-12-01

0

/files/thumbnails/483/916/003/262x150.crop.jpg?20241127115329

레드스톤

[노트블럭 커버] 뉴진스 - ETA 3

노트블럭전문가

2024-11-27

1

/files/thumbnails/150/925/003/262x150.crop.jpg?20241123005717

건축

응답하라 1988 ? 1

팀뉴일리시

2024-11-23

5

/files/thumbnails/761/908/003/262x150.crop.jpg?20241025153749

건축

서울 숭례문(崇禮門) 6

KHC

2024-10-25

2

/files/thumbnails/578/899/003/262x150.crop.jpg?20241010142350

건축

경주 월정교 1

KHC

2024-10-10

2