파이썬의 데이터 타입별 Copy

지니🧸·2024년 6월 17일
0

CS 저장소

목록 보기
45/48

Shallow copy, Deep copy

얕은 복사 (Shallow Copy)

슬라이싱으로 값을 할당하면 새로운 id가 부여되어 서로 영향을 받지 않는다

a_arr = [1, 4, 6]
b_arr = a_arr[:]
b_arr[0] = 100
print(*a_arr) # 1 4 6
print(*b_arr) # 100 4 6

두 배열이 서로 다른 객체이기는 하지만, 객체 내 각 아이템은 각각 같은 메모리 주소를 가르킨다

깊은 복사 (Deep Copy)

깊은 복사는 내부 객체까지 전부 새로 복사되는 과정이다

copy.deepcopy


ab를 할당하고 나서 a의 값의 변경이 b에 반영될 때도 있고, 안 될 때도 있다. 데이터 타입에 따라!

왜 그럴까?

파이썬에는 mutableimmutable 객체가 존재한다
list, set, dict는 mutable한 반면,
bool, int, float, tuple, str, frozenset은 immutable하다

immutable 변수에 값을 할당하면 값을 변경하는게 아닌, 값의 재할당이 이루어지는 것이다

mutable 변수에

1. 변수에 대하여

a = 2
b = a
a = 3
b = 4
print(a, b) # 3 4

b = a에서 두 변수가 같은 메모리 주소를 바라보지만,
a = 3에서 새로운 값이 할당되어 더이상 둘이 같은 곳을 바라보지 않는다. a는 새로운 메모리 주소를 가르킨다

2. 1차 배열에 대하여

(1) 변수 할당

a_arr = [2, 2]
b_arr = a_arr
a_arr[1] = 3
b_arr[0] = 100
print(*a_arr) # 100 3
print(*b_arr) # 100 3

위는 변수 할당의 예시다
두 배열 모두 같은 메모리 주소를 가르킨다
둘 중 하나에 발생하는 변화는 다른 하나에 반영된다

(2) 복사

a_arr = [1, 4, 6]
b_arr = a_arr[:]
b_arr[0] = 100
a_arr[1] = 10000
print(*a_arr) # 1 10000 6
print(*b_arr) # 100 4 6

위는 복사의 예시다
a_arr를 복사해서 b_arr라는 새로운 객체를 생성하기 때문에 b_arr에 대한 변화가 a_arr에 반영되지 않는다

a_arr에 대한 변화도 b_arr에 반영되지 않는다

3. 2차 배열에 대하여

(1) 변수 할당

a_2d_arr = [[1, 2], [3, 4]]
b_2d_arr = a_2d_arr
b_2d_arr[0][0] = 100
for i in range(2):
    print(*a_2d_arr[i]) # [[100, 2], [3, 4]]
for j in range (2):
    print(*b_2d_arr[j]) # [[100, 2], [3, 4]]

2-(1)와 같다

(2) 복사

a_2d_arr = [[1, 2], [3, 4]]
b_2d_arr = [row[:] for row in a_2d_arr]
b_2d_arr[0][0] = 100
for i in range(2):
    print(*a_2d_arr[i]) # [[1, 2], [3, 4]]
for j in range (2):
    print(*b_2d_arr[j]) # [[100, 2], [3, 4]]

2-(2)와 같다


https://wikidocs.net/16038

profile
우당탕탕

0개의 댓글