파이썬을 배우면서 너무 어려웠던 얕은복사와 깊은복사를 정리해보았다.
1.얕은복사
- 변수 이름은 다르지만 결국 동일한 주소를 나타내는 경우
- 결국 두 변수는 같은 변수나 다름없다.
In: arr=[10, 20, 30]
copy1 = arr
print(copy1)
Out: [10, 20, 30]
In: print(id(copy1), id(arr))
Out: 140682201559680 140682201559680
->얕은복사를 했기때문에 주소가 같다.
In: copy2 = copy1
print(id(copy1), id(arr), id(copy2))
Out:140682201559680 140682201559680 140682201559680
->얕은복사를 했기때문에 주소가 같다.
In: copy2[2] = 156
print(copy2)
Out: [10, 20, 156]
In: copy1
Out: [10, 20, 156]
In: arr
Out: [10, 20, 156]
#얕은 복사로 주소를 복사해왔기 때문에 copy2를 건드렸는데 copy1과 arr의 값도 함께 바뀐다.
- 위에서 사용한 예제를 이해하기 쉽게 파이썬 튜터로 살펴보자!
-> 같은 주소를 사용하고 있기 때문에 하나의 변수에 값이 변했을때 ('copy2[2]=156'을 통해 바뀐값) 다른 변수의
값도 함께 변한다.
- 슬라이싱하면 값도 제대로 바뀌고 원본도 보존되는 거 같은데 왜 얕은 복사라고 부르는걸까?
차원을 하나 더 깊게 들어가면 여전히 같은 메모리 주소를 복사하기 때문이다.
In: arr2D = ['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'Goodafternoon']]
arr2Dcopy = arr2D
print(arr2Dcopy)
Out: ['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'Goodafternoon']]
In: arr2Dcopy2 = arr2Dcopy[2:5]
print(arr2Dcopy2)
Out:['Hi', ['Goodnight', 'Goodmorning', 'Goodafternoon']]
In: arr2Dcopy2[-1][-1] = 'night'
print(arr2D, arr2Dcopy, arr2Dcopy2)
Out:['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'night']],
['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'night']],
['Hi', ['Goodnight', 'Goodmorning', 'night']]
In: arr2Dcopy2[-1] = 'night'
print(arr2D, arr2Dcopy, arr2Dcopy2)
Out: ['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'Goodafternoon']],
['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'Goodafternoon']],
['night', 'night'])
->차원을 깊게 들어갔을 때 여전히 같은 메모리 주소를 쓰고 있다.
- 위에서 사용한 예제를 이해하기 쉽게 파이썬 튜터로 살펴보자!
2. 깊은복사
- 메모리주소를 참조해서 원본을 훼손하는 일을 막고있다.
- copy라는 모듈의 deepcopy를 사용해야 한다.
In: import copy
arr2D =['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'night']]
arr2Ddeep = copy.deepcopy(arr2D)
print(arr2Ddeep)
Out: ['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'night']]
In: arr2D[-1][-1] = 'morning'
print(arr2D, arr2Ddeep)
Out: ['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'morning']],
['Hello', 'Bye', 'Hi', ['Goodnight', 'Goodmorning', 'night']])
->deepcopy를 사용하면 서로의 변수에 영향을 미치지 않는다.
- 위에서 사용한 예제를 이해하기 쉽게 파이썬 튜터로 살펴보자!
->깊은복사를 해왔기 때문에 마지막 변수에 mornig 변환이 다른 변수에게 영향을 미치지 않는다.
'<플레이데이터>부트캠프의 기록 > Python' 카테고리의 다른 글
Python_6 : 출력 문자열 꾸미기 (파이썬) (0) | 2022.07.11 |
---|---|
Python_5 : 나에겐 너무 어려웠던 While(파이썬) (0) | 2022.07.09 |
Python_4 : 이중 for문 이해하기 (파이썬) (0) | 2022.07.07 |
Python_3 : 파이썬 왕 초보의 첫 코드 만들기 (파이썬) (0) | 2022.07.06 |
Python_1 : 파이썬의 첫걸음 (0) | 2022.07.04 |