본문 바로가기
개인공부/Python

[Python] Mutable vs. Immutable 차이점?

by BuyAndPray 2020. 9. 29.
반응형

Python을 가지고 재귀 함수를 연습하다가 결과 값이 예상 밖으로 나왔고, 왜 그런 현상이 나왔는지 분석해보았다. 결론적으로 Python에서 변수는 2가지 종류가 있는데 하나는 변할 수 있는 Mutable 변수이고 나머지 하나는 변할 수 없는 Immutable 변수이기 때문이다.

 

def recursive(a, value):
    
    a.append(value)
    
    if value == 5:
        print(a)
        return
    
    recursive(a, value + 1)
    print(a)
    
recursive([], 1)

위와 같은 함수를 구현했을 때 결과 값은 아래와 같이 나온다.

# 결과 값
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

내가 예상했던 결과는 아래와 같았다.

# 기대 했던 값
[1, 2, 3, 4, 5]
[1, 2, 3, 4]
[1, 2, 3]
[1, 2]
[1]

 

나는 재귀 함수가 리턴되면서 인수 a에 있는 값이 과거 값으로 변경될 줄 알았지만 결과는 그러지 않았고, 그 이유는 Python에서 리스트는 mutable value 이기 때문이다.

 

Mutable vs. Immutable

Mutable value는 Python에서 변할 수 있는 객체이고 List와 Dict 자료형이 포함된다.

Immutable value는 Python에서 변할 수 없는 객체를 말하고 Number, String, Tuple 자료형이 포함된다.

 

하지만 이 내용으로는 설명이 충분히 되지 않기 때문에 Python에서는 변수가 어떻게 할당되는지를 통해 두 value의 차이를 자세히 알아보겠다.

 

Python assignment

x = 12

다음과 같이 x라는 symbolic name에 12라는 value를 할당시키는 경우 Python에서는 names refer to value 혹은 name is a reference to a value라고 말한다. 즉, Python에서 변수는 오로지 메모리에 저장되어 있는 value를 참조하는 역할만 할 뿐이다.

 

x = 12
x = 14

이때 위와 같이 x에 새로운 value를 할당시키면 12는 number 즉 Immutable 변수이기 때문에 실제 x가 참조하던 12가 변하는 것이 아니라 새로운 14가 만들어지고 이 값을 x가 새로 참조하는 것이다.

 

Immutable value는 변경 불가능하다

하지만 아래와 같은 코드를 실행시키는 경우 리스트는 Mutable 변수이기 때문에 x가 참조하는 [1, 2, 3] 리스트를 변경할 수 있고, 4는 x의 제일 마지막에 삽입되게 된다.

x = [1, 2, 3]
x.append(4)

mutable value는 변경 가능하다

결론

결론적으로 Python에서 리스트는 Mutable value 이기 때문에 append 메서드로 새로운 값을 추가할 때마다 x가 새로운 리스트 객체를 만들지 않고, 기존 리스트 객체를 변경한다.

 

따라서 제일 처음 보여준 예시에서 value가 5가 되었을 때 a의 리스트는 [1, 2, 3, 4, 5]가 되었고, 함수를 리턴 함에 따라 변수의 참조값이 바뀌는 것은 아니기 때문에 똑같이 [1, 2, 3, 4, 5]가 출력되는 것이다.

 

제대로 출력하는 법?

내가 기대했던 값을 제대로 출력하려면, Python의 + operator를 활용하면 된다. + operator를 리스트에 사용하게 될 경우 append 메서드를 사용하지 않고, 기존 리스트에 더하고자 하는 리스트를 추가한 새로운 리스트를 만들고 이 새로운 리스트를 변수가 참조하게 된다.

 

결과적으로 아래와 같이 코딩하면 원하는 결괏값이 나오게 된다.

def recursive(a, value):
    
    a = a + [value]
    
    if value == 5:
        print(a)
        return
    
    recursive(a, value + 1)
    print(a)
    
recursive([], 1)
# 결과값
[1, 2, 3, 4, 5]
[1, 2, 3, 4]
[1, 2, 3]
[1, 2]
[1]
반응형

'개인공부 > Python' 카테고리의 다른 글

[Python] 정규표현식 완전정복!  (1) 2020.12.07
[Python] heapq 모듈 사용법  (0) 2020.10.30
[Python] Input vs. sys.stdin.readline 차이점?  (2) 2020.10.02

댓글