ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 스택(stack)과 힙(heap) 개념 및 예시
    파이썬 2023. 4. 17. 14:06

    자료의 분류

    현대 프로그램 언어에서 자료는 크게 두 가지로 분류된다. 

    1) 기본 자료형 : 숫자, 문자열, 불 등 작고 간단한 자료

    2) 복합 자료형 : 리스트, 딕셔너리, 객체 등 크고 무거운 자료

     

    기본 자료형은 크기가 작고 고정되어 있어 상자(스택)에 넣어 차곡차곡 보관하고,

    복합 자료형은 크기가 정해져 있지 않은 복잡한 자료로 다른 창고(힙)에 넣고 보관하고 창고 위치를 스택에 보관한다(그림 1). 

     

    그림 1. 스택과 힙

     

    함수 호출(생성)과 스택

    함수는 복합 자료형이기 때문에 힙(heap)에 저장된다.

    함수를 호출할 때마다 스택(stack)이 새로 생성되고, 함수 호출이 완료되면 스택(stack)은 사라진다. 

    <예시 1>
    a = 10                           
    b = [1, 2, 3,4]      → 전역 위치에서 a, b 변수 생성 

    def function() : 
      a = 20
      b = [5, 6, 7, 8]
    function()           → 함수 내부에서 a, b 변수 생성 → 함수 생성 완료 후 a, b 변수가 저장된 스택이 제거됨

    print(a)
    print(b)              → 함수 내부에서 생성된 a, b 변수가 제거되었으므로,
                                  전역 위치에서 저장된 a, b 변수가 출력됨
    <코드분석(Python Tutor)>
    함수 스택에 생성하였던 a, b 변수(a=20, b=[5, 6, 7, 8])은 함수 출력 완료 후 사라지므로
    최종적으로 출력되는 a, b는 각각 10과 [1, 2, 3, 4]가 된다. 

    출력)
    10
    [1, 2, 3, 4]
    <예시 2. global 키워드>
    a = 10
    b = [1, 2, 3,4]

    def function() : 
      global a, b         → global 키워드를 사용하면 함수 스택에 새로운 변수를 만들지 않는다.
      a = 20
      b = [5, 6, 7, 8]    
    function()

    print(a)
    print(b)

    출력)
    20
    [5, 6, 7, 8]
    <코드분석(Python Tutor)>
    global 키워드를 사용하면 함수 스택이 생성되지 않고
    전역 위치의 a, b 변수가 변경되는 것을 알 수 있다. 
    <예시 3. UnboundLocalError>
    함수가 실행되기 전에 내부에서 생성되는 모든 변수에 대한 정보를 파악한다. 
    아래 코드에서 함수 내부에 있는 print 함수를 실행하기 전에 
    컴퓨터는 "a, b 변수는 함수 스택 내부에 있을 것이다"라고 예측하는데,
    함수 스택이 생성되기 전이므로 UnboundLocalError가 발생한다. 
    해결책은 global 키워드를 사용하는 방법이다. 
    a = 10
    b = [1, 2, 3,4]

    def function() : 
      print(a)      → 함수 스택 내부에 변수가 없으므로 에러 발생! 
      print(b) 
      a = 20
      b = [5, 6, 7, 8]
    function()

    print(a)
    print(b)

    출력)
    UnboundLocalError
    <해결책. global 키워드>
    a = 10
    b = [1, 2, 3,4]

    def function() : 
      global a, b      → global 키워드를 사용하여 외부에 있는 a, b 변수를 지정해준다.
      print(a)
      print(b)
      a = 20
      b = [5, 6, 7, 8]
    function()

    print(a)
    print(b)

    출력)
    10
    [1, 2, 3, 4]
    20
    [5, 6, 7, 8]

    댓글

Designed by Tistory.