ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 54 - (파이썬) 메모리 구조 : 스택과 힙, 함수와 결합할 때
    study with Q - 파이썬 2024. 6. 15. 11:05

    # 메모리 관리에서의 스택과 힙

     

    현대적인 프로그래밍 언어에서는 자료를 크게 2가지로 구분

    1) 기본 자료형

    •  (마치 내 월급처럼) 작고 간단한 것 
    •  숫자, 문자열, 불 등 (문자열은 크기가 매우 커질 수 있지만 사용적인 관점에서 기본적이라서 기본 자료형에 포함시키는 편이다.)
    • 크기가 작고 고정되어 있으므로 → (통장에) 상자에 넣어서 옆에 차곡차곡 보관해욥
    • 이렇게 기본 자료형들이 정리되어 있는 공간을 스택(stack)이라고 한다.


    2) 복합 자료형

    • (우리 레오처럼) 크고 무거운 것
    •  리스트, 딕셔너리, 객체 등
    •  (아무래도 고양이는 액체니까) 크기가 정해져있지 않고 → 다른 창고에 보관을 하고, 이 위피를 상자에 넣어서 차곡차곡 보관해욥
    • 이렇게 객체 자료형이 저장되어 있는 거대한 창고를 힙(heap)이라고 한다.
      그리고 창고에 어떤 위치에 저장되어 있는지 스택에 다시 기록한다고 생각하자 

     

    파이썬 튜터로 확인해보면...

    기본 자료형인 숫자, 불, 문자열은 스택(stack)에 들어가있는 것을 볼 수 있다.

    복합 자료형인 리스트, 딕셔너리는 힙(heap)에 들어가있고 힙의 위치를 다시 스택에 기록된 것을 볼 수 있다.


     

    용어 기억하기

    # 할당 :  어떤 변수에 값을 저장하는 과정

    # 접근/참조 : 어떤 변수에 값을 꺼내는 과정


    # 함수와 스택

    - 함수와 결합이 될 때는 할당과 참조가 조금 다른 형태로 구성된다. (아니 지금 방금 배웠는데 그게 뭔 소리여)

     

    x = 23
    y = [1,1,2,3,5,8,13]
    
    def function(): 
      x = 19
      y =[13, 19, 21, 24, 34, 25]
    function()
    
    print(x)
    print(y)
    >>>
    23
    [1, 1, 2, 3, 5, 8, 13]

     

    ... 왜요?😳

     

    x는 숫자(기본 자료형)이므로 스택(stack) 넣는다

    y는 크기가 큰 리스트(복합 자료형)이므로 힙(heap)에 넣고 힙의 위치를 다시 스택에 기록한다.

    함수도 (복합 자료형)이므로 힙(heap)에 넣고 힙의 위치를 다시 스택에 기록한다.

     

     

    이어서 함수를 호출하면 함수를 위한 전용 스택(함수 스택)을 만든다. (VIP가 오셨군요. 이쪽으로 모시겠습니다. 찡긋) 

    : 함수 호출을 1번하면 함수 스택 1개, 함수 호출을 100번하면 함수 스택 100개가 만들어진다.

    funtion이라는 스택 내부에 x와 y를 따로 저장해두었다가 함수 호출이 끝나면 만들었던 스택을 제거한다.

     

    이미 함수 호출이 끝나서 만들었던 스택이 제거되었으므로 이상태에서 x,y를 호출하게 되면 기존의 x, y가 나오게된다.

     

    참고로) 함수는 호출할 때마다 스택이 만들어진다. → 재귀함수와 연결

     

    # 함수와 스택 참조

    : 파이썬에서 변수를 참조할 때는 자신과 가까운 스택부터 위로 올라가면서 참조

    x = 0
    y = [1,1,2,3,5,8,13]
    
    def function(): 
      x = 100
      y = [0,1,2,3,4]
      print(x) #가까운 스택은 위의 x = 100
      print(y) #가까운 스택은 위의 y = [0,1,2,3,4
    function()
    
    print(x) #요놈의 스택은 x = 0
    print(y) #요놈의 스택은 y = [1,1,2,3,5,8,13]
    
    >>>
    
    100
    [0, 1, 2, 3, 4]
    0
    [1, 1, 2, 3, 5, 8, 13]

     


    https://replit.com/@wh3308/memorigujo#main.py

Designed by Tistory.