얕은 복사란
- 배열 a에 배열 b를 할당하면 배열이 새로운 메모리 공간에 같은 값이 할당되는 것이 아니라 같은 메모리 공간을 바라보게 된다.
- 그렇게 되면 b를 변경했을 때 a까지 변경된다.
- 단일 값을 저장하는 변수에 대한 배정은 얕은 복사가 일어나지 않는다.
a = [1, 2, 3, 4]
b = a
b[0] = 2
print(a) # [2, 2, 3, 4]
방심할 수 있는 얕은 복사가 일어나는 경우
1. *연산을 이용해서 만든 배열
arr = [[0]]*4
print(arr) # [0, 0, 0, 0]
arr[0][0] = 1
print(arr) # [1, 1, 1, 1]
2. 배열에 다른 배열 배정 : 이 경우는 가장 대표적이지만 아래와 같은 경우 방심할 수 있다.
a[i] = a[i-1] # a가 이차원 배열일 때
a = [[1], [2] ,[3]]
a[0] = a[1]
a[1][0] = 5
print(a) # [[5], [5], [3]]
3. 파라미터로 배열을 받아온 경우
a = 1
b = [2, 3]
def func(a, b):
a = 2
b[1] = 4
func(a, b)
print(a, b) #-> a 값은 변하지 않지만 b는 [2, 4]로 바뀜
깊은 복사하기
1. deepcopy 이용
from copy import deepcopy
a = [1, 2, 3, 4]
b = deepcopy(a)
- 위와 같이 deepcopy를 통해 복사해주면 깊은 복사가 된다.
- 새로운 메모리 주소에 b를 할당한다.
- b를 변경해도 a에 영향을 미치지 않는다.
2. 슬라이싱 이용
a = [1, 2, 3, 4]
b = a[1:]
b[1] = 6
print(a) # [1, 2, 3, 4]
- 슬라이싱으로 값을 가져와서 배정하면 깊은 복사가 된다.
반응형
'python' 카테고리의 다른 글
[Python] nonlocal, global로 변수의 scope 변경하기 (파이썬에서 전역변수 사용하기) (4) | 2021.03.29 |
---|