개인 자료란 (JE)

  서버 커뮤니티

Profile logdev 대표칭호 없음
Profile

python

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

2020.05.31 조회 수 113 추천 수 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/762/770/003/262x150.crop.jpg?20240418073724

레드스톤

T.B.H (고민중독) | 노트블럭 버전 | NoteBlock Cover [한국어 영어 중국어 가사 추가]

노트블럭전문가

2024-04-18

0

/files/thumbnails/218/767/003/262x150.crop.jpg?20240412130213

레드스톤

우리의 꿈 - 원피스 오프닝

노트블럭전문가

2024-04-12

0

/files/thumbnails/505/766/003/262x150.crop.jpg?20240411122306

레드스톤

기동전사 건담 수성의 마녀 | 노트블럭 커버 1

노트블럭전문가

2024-04-11

1

/files/thumbnails/932/765/003/262x150.crop.jpg?20240410124459

레드스톤

마인크래프트 노트블록으로 만든 『 밤양갱 (Bam Yang Gang) 』

노트블럭전문가

2024-04-10

0

/files/thumbnails/403/765/003/262x150.crop.jpg?20240409190538

레드스톤

마인크래프트 노트블록으로 만든 『 밤양갱 (Bam Yang Gang) 』

Sonttukk

2024-04-09

4