"Life is Full of Possibilities" - Soul, 2020

IT (프론트엔드)

[Python] 얕은복사 vs 깊은복사

m2ndy 2023. 2. 11. 18:55

2차원 배열 생성 시, List Comprension 사용

-> 각각의 독립적인 원소들을 만들어 id 값의 중복을 없앰

 

- 두 변수 id의 중복이 발생한다면?

== 두 변수는 같은 데이터를 가리킨다

== 얕은 복사

a = [1, 2, 3]
b = a           # 얕은 복사
print(b)
# [1, 2, 3]

b[0] = 10
print(b)
# [10, 2, 3]

print(a)
# [10, 2, 3]

 b 값을 변경했지만 a 값도 바뀜

 

print(id(a))
# 1701393449088
print(id(b))
# 1701393449088

 a와 b는 같은 id값을 갖고 있음

 

 

 

얕은 복사가 일어나지 않게 하려면?

 

 

1. 깊은 복사 (deepcopy) 사용

import copy

a = [1, 2, 3]
c = copy.deepcopy(a)
print(c)
# [1, 2, 3]

c[0] = 100
print(c)
# [100, 2, 3]

print(a)
# [1, 2, 3]


print(id(c))
# 1701393606848
print(id(a))
# 1701387457792

- 각각 다른 id값에 저장되지만, 파일의 크기가 커짐

 

 

 

 

2. List Comprehension

 

2차원 배열 문제에서, 0으로 채워진 배열을 만들어야 할 때 얕은 복사가 일어나지 않도록 배열을 만듦

# SWEA 4836 참고

 

배열을 아래와 같이 만들었을 때,

arr = [[0]*10]*10
# [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
arr[0][0] = 1
# [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

모든 원소의 0번째 인덱스에 1이 할당됨

 

이를 해결하기 위해서 List comprehension 사용

arr = [[0 for j in range(10)] for i in range(10)]
# 또는
arr = [[0]*10 for _ in range(10)]

각 원소들이 독립적으로 존재하게 된다

arr = [[0] * 10 for _ in range(10)]
print(arr)
# [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

arr[0][0] = 1
print(arr)
# [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]