-
Python Data CopyComputer Science/Basic Programming with Python 2021. 11. 9. 01:09
Mutable vs Immutable
Python의 모든것은 Object이다. 코딩을 하다보면, 선언해놓은 것들을 바꿔줘야하는 경우가 생긴다. 여기서 이 Object들은 Mutable 또는 Immutable Object가 나뉘는데, 위의 표를 보면 알 수 있듯, bool, int, float, tuple, string등은 Immutable 하다. 즉, 한번 선언한 이후에 다시 값을 정해주면, 메모리에 업데이트 하는것이 아니라, 새로운 메모리를 사용한다. 이점에 있어서 가장 많이 영향을 받는것이 바로 복사, 즉 Copy이다.
Immutable Data Type Copy
Immutable, 변경할 수 없다는 말이다. 물론, Variable에 연결되어있는 값은 바뀔 수 있어도, 메모리에 한번 저장된 값은 바뀌지 않는것을 Immutable 하다고 한다.
다음 예시를 보자.
a = 1 b = a b = b + 1 print(a) 1 print(b) 2
a가 있었고, b가 있었는데, b의 값을 업데이트 하자, 새로운 값이 b에 저장되었고, a는 변함이 없었다. boolean 역시 마찬가지다.
isGood = True isPretty = isGood isGood = False print(isGood) False print(isPretty) True
다른 boolean을 복사했어도, 기존 값이 바뀌어도, 복사했던 boolean은 복사했을때의 값을 가지고 있다. 왜냐하면, 변경된 boolean은 값이 업데이트 되면서, 기존에 사용했던 메모리가 아닌 다른 메모리에 새로운 "False"를 할당해서 그 값을 쓰게되기 때문이다.
Mutable Data Type Copy
하지만 Mutable한 데이터 타입은 다르다. list, set, dictionary의 경우에 위에같이 복사를 하게되면 아래와같은 일이 발생한다.
a = [1, 2, 3, 4] b = a b[2] = 0 print(a) [1, 2, 0, 4] print(b) [1, 2, 0, 4]
분명 b만 바꿔달라고 했는데, a까지도 바뀌어있는것을 확인할 수 있다. 사실 a와 b는 같은 메모리를 보고있다. 그렇기때문에 a를 바꾸어주어도 b도 바뀌는것이다. 같은 정보에 2가지의 이름이 달려있게 되는것이다. 그래서 '=' 을 이용한 copy는, 정보를 떼어다가 복사하는게 아닌, 메모리가 어디에 위치해있는지 정보를 똑같이 갖고, 이름만 다르게 붙인것이다. 실제로 a를 바꾸어주면, b도 바뀌게 된다.
a[0] = 7 print(a) [7, 2, 0, 4] print(b) [7, 2, 0, 4]
그렇다면, 복사를 하지만 오리지널 값은 건드리지 않으려면 어떻게해야할까? 바로 copy()를 사용하면 된다. 사실 이것보다 조금더 고차원적인 deepcopy()도 존재하지만, 이것은 나중에 알아보도록 한다.
a = [1, 2, 3, 4] b = a.copy() b[0] = 7 print(a) [1, 2, 3, 4] print(b) [7, 2, 3, 4]
b의 첫번째값(index 0)을 7로 바꾸어주었더니, 이번에는 a는 그대로이고 b만 변경되었다.
a[-1] = 0 print(a) [1, 2, 3, 0] print(b) [1, 2, 3, 4]
마찬가지로 a의 마지막값을 0으로 바꾸었더니, a만 바뀌었고 b는 그대로였다.
그래서 Data Type이 Mutable인지 Immutable인지 기억하고, copy()를 활용해야 버그없는 코드를 생성할 수 있다.
'Computer Science > Basic Programming with Python' 카테고리의 다른 글
Python's if/elif/else (0) 2021.11.11 Python Operators (0) 2021.11.09 Python Dictionary (0) 2021.11.09 Python's Sequential Type (0) 2021.11.08 Python's String (0) 2021.11.08