-
파이썬 - 함수의 호출과정 /stack call, frame파이썬 정리 2024. 4. 26. 12:23
재귀함수 참 쓰기 힘드네
파이썬 코딩 도장: 29.5 함수의 호출 과정 알아보기 (dojang.io)
def factorial(n): if n == 0: return 1 else: return n * factorial(n-1) # 팩토리얼 함수 호출 result = factorial(5) print(result) # 출력: 120
위의 함수를 잘 째려 보다 보면 나처럼 헷갈릴수 있다.
바로
1) n을 어떤 값을 넣든간에 최종 리턴이 return 1인 이상
결과값도 1인것 아닌가?
2) 5*5*4*5*3*5*2*5*1*1 으로 나오는 것 아닌가?
왜 아닌가?
1. GPT 가라사대 파이썬(다른언어 포함)은 콜 스택(Call Stack)구조를 가진다고 한다. 이 말이 무엇인가?
위의 factorial 함수를 보면 최종적으로 fac(0)에 도달할때까지의 모든 fac(nEk)가 필요하고 #적당히 시그마라고 읽자
이를 각 스택으로 저장하게 된다. 이후 fac(n)을 계산할 때는 n*fac(n-1)를 호출(call)하여 계산하는데, 이를 5를 기준으로 숫자로 다 적어서 과정을 설명하자면
f(0)=1, f(1)=1*1, f(2)=2*1, f(3)=3*2, f(4)=4*6, f(5)=5*24 으로 진행된다.
이를 설명하기 위해서 위의 블로그 주소로 들어가보면 함수에는 호출 스택과 프레임이 존재함을 알 수 있으며
필요 내용이 호출되면 프레임이 소멸하는 모습을 보면 값과 프레임이 사라지면서 쌍소멸이라는 말이 생각난다
파이썬 함수 호출 방식
파이썬의 함수는 스택(stack) 방식으로 호출된다.
함수의 excution(runtime) context가 호출된 순서대로 스택 메모리 공간에 차곡차곡 쌓여가고 함수가 끝나면 위쪽 방향으로 사라진다. 이와 같은 콜 스택 자료구조를 통해 현재 실행 중인 서브(하위) 루틴의 exciton context를 담고 서브 루틴의 실행이 끝났을 때, 제어(내용)를 반환할 지점 보관한다.
실행 컨텍스트
자바 스크립트에서 흔히 Execution context라고 하는 실행 컨텍스트는 파이썬에서는 runtime context라고 부르는데, 이 실행 컨텍스트는 코드를 실행하는데 필요한 환경을 담고 있는 객체 = 코드 덩어리
선입 후출 방식
자바 스크립트의 실행 컨텍스트 내용인데, 그 역할이 파이썬의 frame object 와 일치한다.
Outer = 이전 실행 컨텍스트 : 파이썬 frame object 의 f_back 속성도 같은 역할
파이썬 전역 프레임 / 스택 프레임
전역 프레임은 스크립트 전체에서 접근 가능한 메모리 공간이고, 스택 프레임은 호출된 함수의 지역 변수가 존재하는 메모리 공간이다.
'파이썬 정리' 카테고리의 다른 글
푸바오 - Series to dict, list (0) 2024.05.02 파이썬 - 문자열 입력값 및 연산 (0) 2024.04.22 파이썬 - 행렬(차원) / isinstance () (1) 2024.04.19 파이썬 - TRY-EXCEPT (0) 2024.04.19 파이썬 - 숫자 뒤집은 배열 (0) 2024.04.08