ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] immutable, mutable 객체
    Python 2022. 1. 6. 15:08

    핵심: 파이썬의 immutable 객체는 불변 + 싱글톤이다.

    파이썬은 모든 것이 객체

     

    자바의 경우 primitive타입(int,byte,boolean,float,char,double등)변수와 참조타입(class, interface)변수가 존재한다.

    primitive 타입 변수에는 객체를 담을 수 없고 해당하는 타입(int,float등)인 단순 값(3, 3.5)이 저장된다. 

    참조 변수에는 객체의 주소가 저장된다.

    //java
    //main함수(로컬)
    
    int a =3; 
    //primitive int형 변수 a에는 값인 3이 저장됨
    
    //Person클래스 선언되어있다고 가정
    Person person = new Person();
    //Person타입 참조변수 person에는 new 연산자를 통해 만들어진 객체의 주소가 담긴다.

     

     

    그러나 파이썬은 동적언어로 런타임에 변수의 타입이 정해진다. 그렇기 때문에 변수의 선언시 타입을 선언하는 것이 없다. primitive 타입 자체가 존재하지 않으므로 변수는 항상 객체를 가리킨다. 

    즉 정수3, 실수 3.5 이러한 값들도 모두 int , float 클래스의 객체이다.

    def info(obj):
        print('id:', id(obj))
        print('type:', type(obj))
        print('print:', obj)
        print()
    
    
    i1 = 1
    info(i1)
    
    i2 = 2
    info(i2)
    
    f1 = 1.5
    info(f1)
    
    f2 = 1.7
    info(f2)


    파이썬의 immutable, mutable 객체

     

    immutable, mutable 객체의 차이는 객체의 상태(속성등), 값의 변경 가능 유무이다.

    즉 변수에 담겨있는 immutable 객체를 다른 객체로 바꾸는 것과는 관련이 없다.

    개인적으로 코틀린의 val 개념(자바의 final변수)을 처음 접했을 때 immutable 이라는 단어를 reference에서 읽은 것 같아서 그것과 잠깐 헷갈렸던 것 같다.

    https://medium.com/@meghamohan/mutable-and-immutable-side-of-python-c2145cf72747

    str 객체는 immutable 객체이므로 원소를 변경할 수 없다.

    def info(obj):
        print('id:', id(obj))
        print('type:', type(obj))
        print('print:', obj)
        print()
    
    
    test_string = "test string"
    info(test_string)
    test_string[0] = 'h' # runtime error


    list 객체는 mutable 객체이므로 원소의 변경, 추가, 삭제등이 가능하다.

    def info(obj):
        print('id:', id(obj))
        print('type:', type(obj))
        print('print:', obj)
        print()
    
    
    test_list = [1, 2, 3, 4]
    info(test_list)
    print('마지막에 element 추가')
    
    test_list.append(5)
    info(test_list)

    list의 마지막에 5값을 추가하였다.

    객체의 주소값을 나타내는 id가 추가 전과 추가 후과 동일한 것을 확인할 수 있다.


    def info(obj):
        print('id:', id(obj))
        print('type:', type(obj))
        print('print:', obj)
        print()
    
    
    x = 10
    print('x')
    info(x)
    
    x = x + 1
    print('x')
    info(x)

    x= x+1은 객체의 상태,속성을 변경시키는 1을 증가시키는 것이 아니라 1값이 더큰 int 객체의 주소를 x 변수에 재할당하는 것이다. 즉 immutable 객체와는 다른 관점이다. 그렇기 때문에 연산 전과 후는 서로 다른 객체이기 때문에 id 값이 다른 것을 확인 할 수 있다. 


    파이썬의 immutable 객체는 다른 언어와 다르게 싱글톤 객체이다.

     

    파이썬의 immutable 객체는 다른언어의 immutable + 싱글톤 개념이다.

    immutable이기 때문에 값,속성들을 변경시킬 수 없는 점 + 싱글톤이기 때문에 객체는 하나만 만들어지고 해당 객체가 공통으로 사용된다. 

     

    객체는 하나만 사용된다.

    a = int('1')
    print('a:', id(a))
    b = int('1')
    print('b:', id(b))
    c = int('1')
    print('c:', id(c))
    d = int('1')
    print('d:', id(d))

    a = float(3.0)
    b = float(3.0)
    print(id(a))
    print(id(b))
    print(id(3.0))

     

    서로 다른 리스트의 element로 포함되어 있는 immutable 객체 또한 하나만 사용된다.

    (예시 int 5 객체)

    list = [1, 5, 9]
    list2 = [5, 9, 1]
    print('list[1]가 가리키는 객체 주소: ', id(list[1]))
    print('list2[0]가 가리키는 객체 주소: ', id(list2[0]))

    'Python' 카테고리의 다른 글

    [NumPy] Broadcasting  (0) 2022.01.23
    [Python] list comprehension  (0) 2022.01.20
    [Python] 클래스 상속과 super()함수의 동작이해  (1) 2022.01.12
    [Python] 클래스 기초  (0) 2022.01.11
    [Python] False,True 관련 연산자 동작(+None)  (0) 2022.01.07

    댓글

Designed by Tistory.