본문으로 바로가기

[Python]파이썬 mutable과 immutable

category Python 2019. 2. 18. 11:36

파이썬에는 변경가능한 객체(mutable) 과 변경불가능한 객체(immutable) 이 있습니다.


변경가능한 객체에는 리스트(list)와 딕셔너리(dict) 이 있습니다.


변경불가능한 객체에는 일반적인 자료형 int, string 등 과 튜플(tuple) 등이 있습니다.


 

일반적인 자료형이 속해있는 변경불가능한 객체(immutable) 부터 알아보겠습니다.



immutable


immutable 은 변경불가능한 객체입니다.


immutable 에는 일반적인 자료형과 튜플이 속해있습니다.


Int

= 1                 #1
>>> id(a)
140729439544144
>>> a += 1            #2
>>> id(a)
140729439544176
cs

String

= 'a'               #a
>>> id(a)
1985199052704
>>> a += 'b'          #ab
>>> id(a)
1985209620944

cs

Tuple

>>> a = (1,2)         #(1,2)
>>> id(a)
1985209935624
>>> a += (3,)         #(1,2,3)
>>> id(a)
1985209858448
cs

immutable 에 속한 객체들은 값이 변경이될떄 객체가 변하는것을 확인 할 수 있습니다.


여기에 속한 객체들은 call by value 의 속성을 띄고있습니다.


Int

>>> a = 1
>>> b = a             #b = 1
>>> a == b            #a = 1 , b = 1
True
>>> b += 1            #b = 2
>>> a == b            #a = 1 , b = 2
False
cs

String

>>> a = 'a'
>>> b = a             #b = 'a'
>>> a == b            #a = 'a' , b = 'a'
True
>>> b += 'b'          #b = 'ab'
>>> a == b            #a = 'a' , b = 'ab'
False
cs

Tuple

>>> a = (1,2)
>>> b = a             #b = (1,2)
>>> a == b            #a = (1,2) , b = (1,2)
True
>>> b += (3,)         #b = (1,2,3)
>>> a == b            #a = (1,2) , b = (1,2,3)
False
cs

immutable 객체들은 값이 변경되는것이 새로운 객체로생성이 되기떄문에 변경이 일어날떄 기존 객체는 변하지 않습니다.



mutable


mutable은 변경 가능한 객체입니다.


mutable에는 리스트와 딕셔너리 등이 속합니다.


List

>>> a = [1,2]         #a = [1,2]
>>> id(a)
1985209849032
>>> a.append(3)       #a = [1,2,3]
>>> id(a)
1985209849032
cs

Dict

>>> a = {1:'a'}       #a = {1:'a'}
>>> id(a)
1985209931096
>>> a[2= 'b'        #a = {1:'a', 2:'b'}
>>> id(a)
1985209931096
cs

mutable 에 속한 객체들은 값이 변경이 일어날떄 객체의 값이 변경되는것을 확인 할 수 있습니다.


여기에 속한 객체들은 call by reference 속성을 가지고 있습니다.


List

>>> a = [1,2]
>>> b = a             #b = [1,2]
>>> a == b            #a = [1,2] , b = [1,2]
True
>>> b.append(3)       #b = [1,2,3]
>>> a == b            #a = [1,2,3] , b = [1,2,3]
True
cs

Dict

>>> a = {1:'a'}
>>> b = a             #b = {1:'a'}
>>> a == b            #a = {1:'a'} , b = {1:'a'}
True
>>> b[2= 'b'        #b = {1:'a',2:'b'}
>>> a == b            #a = {1:'a',2:'b'} , b = {1:'a',2:'b'}
True
cs

mutable 객체들은 값의 변경이 일어날떄 주소가 참조하는 값이 모두 변경되는것을 확인 할 수 있습니다.