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의 값은 서로 영향을 주지 않음.
'Python > Python' 카테고리의 다른 글
[Python] 내장 함수 (1) | 2022.10.11 |
---|---|
[Python] 이터레이터(iterator)와 제너레이터(generator) (1) | 2022.10.11 |
[Python] mutable과 immutable 객체 (0) | 2022.10.11 |
[Python] sys.stdin.readline() (0) | 2022.10.04 |
[Python] 예외처리 - try except문, try finally, try else문 (0) | 2022.10.04 |
댓글