본문 바로가기
Coding Test/Python

[Python] 함수 내부에서 선언한 지역변수를 반환할 수 있을까?

by haerr 2024. 7. 3.

프로그래머스 문제를 풀던 중 의문이 들었다.

이게 반환이 되나?

 

 

C언어에서 배우기를, 함수 내에서 선언한 변수는 해당 함수의 stack 메모리에 할당되는 지역변수이기 때문에, 이 지역변수 반환을 시도하는 경우 반환과 동시에 stack 공간이 사라져 반환이 불가능하다고 배웠다.

 

예시로,

int* create_integer() {
    int num = 10;
    return #
}

위의 함수는 포인터를 반환하는데, 포인터가 가리키는 변수 num은 함수 내부에서 지역 변수로 선언되었다. 함수가 실행을 마치고 반환을 시도하면 num 변수는 사라지게 되므로, 반환된 포인터는 더 이상 유효하지 않다. 이렇게 반환된 포인터를 사용하려고 하면 에러가 발생할 수 있다.

 

 

그렇다면 파이썬에서는 어떨까?하는 궁금증이 생겼다. 지피티에게 물어보니...


Python에서는 변수의 생존 기간과 관련된 개념이 C 언어와 다릅니다. Python에서는 모든 변수는 객체에 대한 참조로 처리됩니다. 이 객체들은 동적으로 관리되며, 메모리 관리는 Python 인터프리터가 자동으로 처리합니다. 따라서 C 언어에서처럼 직접적으로 스택에 변수를 할당하고 해제하는 방식은 아닙니다.

Python에서 함수 내에서 선언된 변수도 함수가 실행될 때 생성되고 함수가 반환될 때 자동으로 메모리에서 해제됩니다. 그러나 Python에서는 함수 내에서 생성된 객체가 함수의 범위를 벗어나더라도 해당 객체에 대한 참조가 있는 한 메모리에서 유지됩니다. 이는 Python의 가비지 컬렉션 기능 덕분입니다. 가비지 컬렉터는 더 이상 사용되지 않는 객체들을 자동으로 해제하여 메모리를 관리합니다.

예를 들어, 다음과 같은 Python 함수를 살펴봅시다:

def create_list():
    my_list = [1, 2, 3]
    return my_list



위의 함수는 리스트를 반환합니다. `my_list`는 함수 내에서 지역 변수로 선언되었습니다. 함수가 반환될 때 `my_list` 변수는 함수 범위를 벗어나지만, 리스트 객체 `[1, 2, 3]` 자체는 여전히 메모리에 남아 있습니다. 이는 Python의 가비지 컬렉션 기능으로 인해 가능한 일입니다.

따라서 Python에서는 함수 내에서 생성된 객체는 함수의 반환과 상관없이 참조가 있으면 메모리에서 해제되지 않습니다. 이는 C 언어에서의 지역 변수의 스택 해제와는 다른 동작을 보여줍니다.


그렇다고 한다. 생각해보니 A프로그래밍에서 파이썬의 Reference에 대한 개념을 배운 것이 생각났다. 

C/C++에서는 동적할당-malloc, new-을 하는 경우에만 heap 메모리에 저장되어 동적으로 관리되는 것과 달리, 파이썬은 항상 힙 메모리에 저장이 되나보당! 확실히 파이썬이 고수준(인간친화적) 언어라서 그런지 메모리구조와 관련하여 이해하기에는 더 어려움이 있는 것 같다.

 

다음에 가비지 컬렉션에 대해서도 알아봐야겠다 ^0^

'Coding Test > Python' 카테고리의 다른 글

[Python] Set (집합자료형)  (1) 2024.10.31
[Python] defaultdict란? | 백준 13423번 Three Dots  (0) 2024.07.01