[TIL] 파이썬 immutable, mutable 변수의 종류와 특징


파이썬 코드를 짜는 도중 특정 변수를 함수에 인자로 넣고 변화를 시켰을 때, 그 변경이 밖에서도 유지가 되는지 궁금하여 다음과 같은 코드를 짜보았다.

class Test:
    def __init__(self, n):
        self.n = n

var_class = Test(0)
var_list = [0]
var_int = 0
var_string = "0"

def plus_one(var_class, var_list, var_int, var_string):
    var_class.n += 1
    var_list.append(1)
    var_int += 1
    var_string += "1"

plus_one(var_class, var_list, var_int, var_string)

print(var_class.n)  # result : 1
print(var_list)  # result : [0, 1]
print(var_int)  # result : 0
print(var_string)  # result : "0"

클래스 인스턴스, 리스트, int, string 총 4개의 자료형에 대해 plus_one 함수에 인자로 넣어 1을 더해봤다. 함수안에서 바뀌었기 때문에 밖에서 각각 변수를 프린트해 변화가 적용되었는지 확인해 보았다.

결과적으로 클래스의 인스턴스와 리스트는 변경이 유지되었지만, int와 string 자료형은 변경이 적용되지 않았다.

왜 이런 차이점이 발생하는 걸까?

[immutable 객체 vs mutable 객체]

파이썬에는 변하지 않는 immutable 객체와 변경 가능한 mutable 객체가 있다.

immutable 객체의 종류에는 int, string, tuple과 같은 자료형이 있으며 mutable 객체는 list, dictionary, 클래스 인스턴스 객체가 있다.

int 자료형이나 string 자료형을 변경할 수 있지 않나요? 라는 질문을 할 수 있는데, 이러한 자료형들은 값 변경 시 새로운 주소를 할당하고 값을 대입하는 원리이다.

따라서 위의 코드에서와 같이 밖에 있는 객체들을 함수 안에서 혹은 임의의 클래스 내에서 변경시킨다면 immutable 객체는 함수, 클래스 밖에서는 변하지 않고 mutable한 객체만 변경이 유지된다.


© 2020. All rights reserved.