본문 바로가기
Python/Python

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

by 기록하는_사람 2022. 10. 11.

mutable과 immutable 객체

📌 mutable과 immutable 객체

https://codingrecord2209.tistory.com/144

 

[Python] mutable과 immutable 객체

immutable 객체 📌 immutable 객체 : 값이 변하지 않는 객체. int, float, bool, str, tuple, set 📌 파이썬은 c, c++과 달리 각 변수마다 메모리가 할당되지 않음. 파이썬에서는 하나의 immutable 값을 여러 개의..

codingrecord2209.tistory.com

 

얕은 복사

📌 mutable 객체의 얕은 복사

mutable 객체를 복사하면 할당된 메모리 주소의 값이 바뀌게 됨.

따라서, 하나의 값이 바뀌면 다른 값도 같이 바뀌게 됨.

a = [1, 2, 3]
b = a

print(id(a), id(b)) # 1510092775488 1510092775488

a[0] = 100
b[2] = 300

print(id(a), id(b)) # 1510092775488 1510092775488
print(a, b) # [100, 2, 300] [100, 2, 300]

 

📌 list 슬라이싱을 통한 새로운 값 할당

a = [1, 2, 3]
b = a[:]

print(id(a), id(b)) # 2140393840704 2140393794368

a[0] = 100
b[2] = 300

print(id(a), id(b)) # 2140393840704 2140393794368
print(a, b) # [100, 2, 3] [1, 2, 300]

+ 추가 설명

더보기

b는 a의 값을 복사하지만, 슬라이싱을 통해 메모리가 새로 할당됨.

따라서, 값을 변경할 경우 a와 b는 서로 영향을 주지 않음. 

 

📌 mutable 객체 안의 mutable 객체인 경우

a = [[1, 2], [3, 4]]
b = a[:]

print(id(a), id(b)) # 2193076283456 2193075956992
print(id(a[0]), id(b[0])) # 2193076002880 2193076002880
print(id(a[1]), id(b[1])) # 2193075956544 2193075956544

a[0] = [100, 200]
a[1].append(5)

print(id(a), id(b)) # 2193076283456 2193075956992
print(id(a[0]), id(b[0])) # 2193075956352 2193076002880
print(id(a[1]), id(b[1])) # 2193075956544 2193075956544

print(a, b) # [[100, 200], [3, 4, 5]] [[1, 2], [3, 4, 5]]

+ 추가 설명

더보기

a와 b에 할당된 주소는 서로 다르지만, a[0]과 b[0], a[1]과 b[1]에 할당된 주소는 서로 같음.

 

a[0]과 b[0]

→ 값을 재할당할 경우, 메모리가 새로 할당되기 때문에 값을 바꿔도 서로 영향을 주지 않음.

 

a[1]과 b[1]

→ a[1]과 b[1]의 주소가 같기 때문에 값이 변경될 경우, 서로 영향을 줌.

 

깊은 복사

📌 깊은 복사

: 내부에 있는 객체들까지 다 새로 복사되는 것.

import copy

a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)

print(id(a), id(b)) # 2698655262848 2698655262976
print(id(a[0]), id(b[0])) # 2698655382336 2698655262912
print(id(a[1]), id(b[1])) # 2698654887104 2698655265856

a[0] = [100, 200]
a[1].append(5)

print(id(a), id(b)) # 2698655262848 2698655262976
print(id(a[0]), id(b[0])) # 2698655263168 2698655262912
print(id(a[1]), id(b[1])) # 2698654887104 2698655265856

print(a, b) # [[100, 200], [3, 4, 5]] [[1, 2], [3, 4]]

+ 추가 설명

더보기

깊은 복사를 통해 내부에 있는 객체들까지 모두 새로 복사가 됨.

→ a, b의 값은 서로 영향을 주지 않음.

 

댓글