shallow copy & deep copy

hyyyynjn·2021년 5월 21일
0

python 정리

목록 보기
12/26
post-thumbnail

✋mutuable & immutuable 객체

  • mutuable 객체 : 값의 수정이 가능한 객체
  • immutuable 객체 : 값의 수정이 불가능한 객체

mutuable 객체

✍list

>>> a = [1, 2, 3]
>>> id(a)
4393788808

>>> a[0] = 5
>>> a
[5, 2, 3]
>>> id(a)
4393788808

list의 값이 변경되었지만, id값은 변하지 않는다

  • id는 변수의 메모리 주소값을 리턴한다
  • 재할당하면 id값도 변경된다

✍set

>>> 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값도 변경된다

immutuable 객체

✍str

>>> 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는 값을 변경할 수 없다

✋변수 간 대입

✍mutuable한 객체의 변수 간 대입

>>> 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도 변경된다

✍immutuable한 객체의 변수 간 대입

>>> 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는 다른 값을 가지게 된다

✋shallow copy(얕은 복사)

copy 모듈의 copy 메소드로 shallow copy를 할 수 있다

✍list slicing

>>> 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는 서로 영향을 받지 않는다

✍list 속 list

>>> 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] 값도 함께 변경된다

✋deep copy (깊은 복사)

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]의 값이 변경되지 않는다

0개의 댓글