파이썬의 모든것들은 여러 속성들과 행동을 가지고 있는 데이터인 객체이다.
가변객체(Mutable object): 생성된 후 상태를 변경할 수 있는 객체이다.
불변객체(Immutable object): 생성된 후 상태를 변경할 수 없는 객체이다.
자료형을 객체 성격에 따라 나누면
가변객체:
list
,set
,dict
불변객체:int
,float
,complex
,bool
,str
,tuple
객체가 가진 정보들을 변경 불가능한 객체를 뜻한다.
하지만 변수를 통해서 객체를 다루다 보면 마치 값이 변한 것처럼, 혹은 변경 가능한 것처럼 보일 때가 있다.
Oni = 1
Oni = 2
print(Oni)
>>>2
위에 예시는 객체의 값이 변한게 아니라, 변수가 담고 있는 객체가 바뀐 것이다.
💡 id()
함수는 객체별로 가지는 유일한 숫자를 출력해준다. 이를 통해 객체가 변했는지 알 수 있다.
Oni = 1
print(id(Oni))
Oni = 2
print(id(Oni))
>>>4500650288
4500650320
만약 객체의 값이 변했다면 동일 id 값이 나왔을 것이다.
숫자형 뿐 아니라 str
, tuple
...
에서도 동일한 결과가 나온다.
str
타입이 가지는 메소드중 몇가지는 이처럼 새로운 값을 만들어 낸다.
Oni = "onion"
print(Oni)
print(id(Oni))
Oni = Oni.upper()
print(Oni)
print(id(Oni))
>>>onion
4413675184
ONION
4413998000
불변객체와 달리 객체가 가진 값들을 변경할 수 있는 객체이다.
Oni = [2, "onion", 100, "text"]
print(Oni)
print(id(Oni))
Oni[2] = "백"
print(Oni)
print(id(Oni))
>>>[2, 'onion', 100, 'text']
4537906560
[2, 'onion', '백', 'text']
4537906560
동일한 id 값을 확인 할 수 있다.
가변객체들은 값을 변경하는 메소드를 실행시키면 새로운 객체를 리턴하는게 아니라 기존의 객체를 변경시키기 때문에 리턴값은 None
이 출력된다.
Oni = [100, 3, 100, 1, 16, 9]
print(Oni)
Oni_sort = Oni.sort()
print(Oni_sort)
>>>[100, 3, 100, 1, 16, 9]
None
메서드를 실행해도 객체의 id는 변하지 않습니다.
Oni = [100, 3, 100, 1, 16, 9]
print(Oni)
print(id(Oni))
Oni_sort = Oni.sort()
print(Oni)
print(id(Oni))
>>>[100, 3, 100, 1, 16, 9]
4478948736
[1, 3, 9, 16, 100, 100]
4478948736