본문 바로가기

python

[Python] 얕은 복사가 일어나는 경우

얕은 복사란

  • 배열 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]
  • 슬라이싱으로 값을 가져와서 배정하면 깊은 복사가 된다. 
반응형