mutuable 객체
: 값의 수정이 가능한 객체immutuable 객체
: 값의 수정이 불가능한 객체
>>> a = [1, 2, 3]
>>> id(a)
4393788808
>>> a[0] = 5
>>> a
[5, 2, 3]
>>> id(a)
4393788808
list의 값이 변경되었지만, id값은 변하지 않는다
- id는 변수의 메모리 주소값을 리턴한다
- 재할당하면 id값도 변경된다
>>> x = {1, 2, 3}
>>> x
{1, 2, 3}
>>> id(x)
4396095304
>>> x|={4,5,6}
>>> x
{1, 2, 3, 4, 5, 6}
>>> id(x)
4396095304
set도 마찬가지로 값을 변경할 수 있다
|=
연산은 set에서or
연산이다 (합집합)- 재할당하면 id값도 변경된다
>>> s= "abc"
>>> id(s)
4387454680
>>> s[0] = 's'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> s = 'def'
>>> id(s)
4388970768
str는 값을 변경할 수 없다
>>> a = [1, 2, 3]
>>> b = a # ✅ shallow copy
>>> b[0]= 5 # ✅ 값 변경
>>> a
[5, 2, 3]
>>> b
[5, 2, 3]
>>> id(a)
4396179528 # 서로 같은 메모리 주소를 가리킨다
>>> id(b)
4396179528
list의 shallow copy
b = a
👉 a와 b는 같은 메모리 주소를 바라본다
👉 즉, b를 변경하면 a도 변경된다
>>> a = "abc"
>>> b = a # ✅ shallow copy
>>> a
'abc'
>>> b
'abc'
>>> id(a)
4387454680 # 서로 같은 메모리 주소를 가리킨다
>>> id(b)
4387454680
>>> b = "abcd" # ✅ 재할당
>>> a
'abc'
>>> b
'abcd'
>>> id(a)
4387454680 # ✅ 서로 다른 메모리 주소를 가리킨다
>>> id(b)
4396456400
str의 shallow copy
b = a
👉 a와 b는 같은 메모리 주소를 바라본다
🛑 b에 다른 값을 할당하면 재할당이 이루어지고 메모리주소가 변경되어
👉 a와 b는 다른 값을 가지게 된다
copy 모듈의
copy
메소드로 shallow copy를 할 수 있다
>>> a = [1,2,3]
>>> b = a[:] # ✅ 슬라이싱을 통한 새로운 값을 할당
>>> id(a)
4396179528 # ✅ 서로 다른 메모리 주소를 가리킨다
>>> id(b)
4393788808
>>> a == b # 할당된 값은 같다
True
>>> a is b # 가리키는 주소는 다르다
False
>>> b[0] = 5 # ✅ 재할당
>>> a
[1, 2, 3] # a에 영향이 없다
>>> b
[5, 2, 3]
슬라이싱을 통한 복사
👉 새로운 id가 부여된다⭐⭐
👉 a와 b는 서로 영향을 받지 않는다
>>> a = [[1,2], [3,4]]
>>> b = a[:]
>>> id(a)
4395624328 # a와 b는 다른 주소를 바라보지만
>>> id(b)
4396179592
>>> id(a[0])
4396116040 # a[0]와 b[0]는 같은 주소를 바라본다
>>> id(b[0])
4396116040
mutuable 객체인 list속에 list가 있는 경우
👉 a와 b는 다른 주소를 바라보지만
👉a[0]
와b[0]
는 같은 주소를 바라본다⭐⭐
>>> a[0] = [8,9] # a[0]를 재할당하면
>>> a
[[8, 9], [3, 4]]
>>> b
[[1, 2], [3, 4]]
>>> id(a[0]) # a[0]와 b[0]는 다른 주소를 바라본다
4393788808
>>> id(b[0])
4396116040
a[0]
를 재할당하면
👉a[0]
와b[0]
는 다른 주소를 바라본다
>>> a[1].append(5)
>>> a
[[8, 9], [3, 4, 5]] # a[1] 의 값을 변경하면
>>> b
[[1, 2], [3, 4, 5]] # b[1] 값도 함께 변경된다
>>> id(a[1])
4396389896
>>> id(b[1])
4396389896
a[1]
의 값을 변경하면
👉b[1]
값도 함께 변경된다
copy 모듈의
deepcopy
메소드로 deep copy를 할 수 있다
- 내부 객체들까지 모두 새롭게 copy한다
>>> import copy
>>> a = [[1,2],[3,4]]
>>> b = copy.deepcopy(a) # ✅ 깊은 복사
>>> a[1].append(5) # a[1]의 값을 변경해도
>>> a
[[1, 2], [3, 4, 5]]
>>> b
[[1, 2], [3, 4]] # b[1]의 값이 변경되지 않는다
b = copy.deepcopy(a)
로 deep copy를 수행하면
👉a[1]
의 값을 변경해도b[1]
의 값이 변경되지 않는다