변수의 범위
변수의 범위(scope)는 해당 변수가 프로그램 내에서 참조되고 변경될 수 있는 영역을 의미한다.
1. 지역변수 (Local Variable)
함수 내부에서 정의된 변수.
- 유효 범위 : 변수가 선언된 함수 내부에서만 존재하며, 함수 외부에서는 접근할 수 없다.
- 함수가 실행될 때 생성되고, 함수가 종료되면 메모리에서 사라진다.
def local_example():
local_var = "로컬 변수"
print(local_var)
local_example()
2. 전역변수 (Global Variable)
함수 바깥, 즉 소스코드의 가장 최상위 수준에서 정의된 변수.
- 유효 범위 : 코드 전체에서 접근할 수 있으며, 함수 내부에서도 읽을 수 있다.
- 함수 내부에서 전역변수의 값을 수정하려면 global 키워드를 사용해야 한다. 그렇지 않으면 함수 내부에 새로운 지역변수를 만들게 된다.
global_var = 10
def modify_global():
global_var = 20
print(global_var) # 1: 20 # 로컬변수가 출력 후 함수는 삭제됨.
modify_global()
print(global_var) # 2: 10 # 글로벌변수가 출력 됨.
# global 키워드 선언
global_var = 10
def modify_global():
global global_var
global_var = 20
print(global_var) # 1: 20
modify_global()
print(global_var) # 2: 20 # global 선언으로 전역변수가 20으로 변경
3. 클로저 변수 (Closure Variable / Nonlocal Variable)
중첩 함수에서 사용되는 특별한 변수. 바깥쪽 함수와 안쪽 함수 사이의 공간에 존재한다고 하여 비지역 변수라고도 부른다.
- 유효 범위 : 바깥쪽 함수가 종료되어도, 안쪽 함수가 살아있는 한 메모리에 유지된다.
- 바깥쪽 함수의 지역변수였던 것이, 안쪽 함수(클로저)가 생겨나면서 안쪽 함수에 의해 포획(Capture)되어 유지되는 변수.
- 안쪽 함수에서 이 변수의 값을 수정하려면 nonlocal 키워드를 사용해야 한다.
def outer_function():
enclosing_var = "둘러싼 범위 변수"
def inner_function(): # 외부 함수가 실행되면 내부 함수는 힙 영역에 등록
print(enclosing_var)
return inner_function # 함수 자체를 리턴 (주소를 리턴)
f = outer_function()
f()
# 둘러싼 범위 변수
클로저 공간
클로저 공간은 내부 함수가 외부 함수의 변수를 계속 사용할수 있도록, 그 값을 따로 저장해두는 메모리 영역(정확히는 객체 구조)이다. 일반적으로 함수가 끝나면 그 안의 지역 변수는 사라지지만, 내부 함수가 그 변수를 참조하고 있으면 파이썬은 해당 값을 지우지 않고 함수 객체 안에 __closure__라는 형태로 보관한다. 이때 저장되는 값은 보통 cell 객체로 감싸져 유지되며, 내부 함수는 실행될 때 이 클로저 공간을 통해 외부 변수에 접근한다.
빌트인 함수
빌트인 함수는 별도의 import 없이 바로 사용할 수 있는, 파이썬이 설치될 때부터 기본적으로 내장되어 있는 함수들을 말한다. 예를 들어 print(), len(), type(), range() 같은 함수들이 이에 해당하며, 파이썬이 실행될 때 자동으로 Built-in 네임스페이스에 등록되어 있기 때문에 어디서든 이름만으로 호출할 수 있다. 변수 이름을 찾을 때 적용되는 LEGB 규칙 (지역(Local) → 비지역(Enclosing) → 전역(Global) → 빌트인(Built-in))에서 마지막 단계에 해당하며, 만약 같은 이름의 변수를 직접 정의하면 Built-in 함수는 가려질 수 있다.
len = 5 # 내장 함수 'len'을 덮어씀
print(len([1, 2, 3])) # 오류 발생! len이 함수가 아니라 변수로 인식됨
# TypeError: 'int' object is not callable
함수 메모리 제거
함수도 파이썬 객체이므로 참조 카운팅과 가비지 컬렉션의 원칙에 따라 동작한다. 함수를 참조하는 변수나 요소가 없게 되면 해당 함수는 가비지 컬렉터에 의해 메모리에서 제거될 수 있다. del 명령어를 사용하여 함수에 대한 참조를 명시적으로 제거할 수 있지만 이것이 함수가 즉시 메모리에서 제거된다는것을 보장하지는 않는다.
def func1():
print('처음으로 만드는 함수')
func1()
# 처음으로 만드는 함수
del func1
func1() # 이후 func1()을 호출하려고 하면 오류가 발생합니다.
# NameError: name 'func1' is not defined
콜백 함수
콜백 함수(callback function)는 다른 함수에 인자로 전달되어, 특정 시점이나 조건이 되었을 때 나중에 호출되는 함수를 의미한다. 파이썬에서는 함수도 객체이기 때문에 변수처럼 전달할 수 있으며, 이를 활용해 어떤 작업이 끝난 뒤 실행할 동작을 미리 정의해 둘 수 있다. 즉, 콜백 함수는 "지금 바로 실행하는 함수"가 아니라, 다른 함수에게 맡겨두었다가 필요할 때 호출되도록 하는 함수이다.
def say_hello(name):
print(f"{name}님 안녕하세요!")
def execute(callback):
print("작업을 시작합니다.")
callback("김사과")
print("작업을 종료합니다.")
execute(say_hello) # say_hello() -> 이 함수를 지금 콜하라, say_hello -> 이 함수의 주소
# 여기서 say_hello가 콜백 함수
# 작업을 시작합니다.
# 김사과님 안녕하세요!
# 작업을 종료합니다.
students = [
{"name": "김사과", "score": 90},
{"name": "반하나", "score": 75},
{"name": "오렌지", "score": 100}
]
def get_score(student):
return student["score"]
result = sorted(students, key=get_score) # key: sort를 할때 기준
print(result)
# [{'name': '반하나', 'score': 75}, {'name': '김사과', 'score': 90}, {'name': '오렌지', 'score': 100}]
# sorted()는 학생 하나하나를 비교할 때마다 get_score()를 호출해서 정렬 기준값을 얻는다.
람다 함수
람다 함수(lambda function)는 파이썬에서 이름 없이 간단한 함수를 한 줄로 정의할 수 있는 익명 함수로, 주로 짧고 일회성으로 사용되는 연산을 표현할 때 활용된다. 일반 함수(def)에 비해 구조는 제한적이지만 코드가 간결해지고, 특히 sorted, map, filter 같은 함수에서 콜백 함수로 자주 사용된다.
lambda 매개변수: 반환할_표현식
- def나 return 키워드가 들어가지 않는다.
- 결과값이 자동으로 반환(return)된다.
1. sorted()의 콜백 함수로 사용
리스트 안에 딕셔너리가 들어있을 때, 정렬을 하고 싶다면 람다 함수를 사용해 정렬 기준(key)을 한 줄로 정의할 수 있다.
students = [
{"name": "김사과", "score": 90},
{"name": "반하나", "score": 75},
{"name": "오렌지", "score": 100}
]
# def get_score(student):
# return student["score"]
result = sorted(students, key=lambda student: student["score"], reverse=True)
print(result)
# [{'name': '오렌지', 'score': 100}, {'name': '김사과', 'score': 90}, {'name': '반하나', 'score': 75}]
2. map() 함수와 함께 사용
map(함수, 리스트) 는 리스트의 모든 요소를 하나씩 꺼내 함수에 넣고 돌린 결과물을 반환해준다.
# 👉 map()은 리스트의 각 요소에 같은 작업을 적용할 때 사용합니다.
scores = [70, 80, 90]
result = list(map(lambda score: score + 10, scores)) # map() 함수는 (기능, 자료)로 작성한다.
print(result)
# [80, 90, 100]
3. filter() 함수와 함께 사용
filter(함수, 리스트) 는 리스트의 요소 중 함수의 조건이 True 인 것만 걸러내 준다.
# 👉 filter()는 조건을 만족하는 값만 골라낼 때 사용합니다.
scores = [45, 70, 88, 52, 100]
passed = list(filter(lambda score: score >= 60, scores))
print(passed)
# [70, 88, 100]'Python' 카테고리의 다른 글
| 객체지향 프로그램 4대 패러다임 (1) | 2026.05.28 |
|---|---|
| 객체지향 프로그래밍 (0) | 2026.05.28 |
| 사용자 정의 함수 part1 (0) | 2026.05.28 |
| 이터러블(Iterable)과 이터레이터(Iterator) (0) | 2026.05.27 |
| 제어문 - 반복문 (0) | 2026.05.27 |