파이썬 변수와 함수

Python
avatar
2025.04.10
·
9 min read

변수 할당

변수 (Variable)은 데이터 값의 식별자

# 나의 고양이 이름 문자열 "bezzy"에 cat을 할당
cat = "bezzy"
print(cat)
> bezzy

변수 네이밍

파이썬에서는 보통 snake case 스타일로 변수 네이밍을 한다.
즉 띄어쓰기 있는 부분에 언더스코어를 넣으면 된다.

myCat(X)
my_cat(O)

변수는 어떤 타입도 담을 수 있다.

파이썬은 동적 타입 시스템을 가진 언어다. (Dynamically Typed Language) 변수가 하나의 타입에 고정되지 않고 여러가지 타입을 가질 수 있다는 뜻

변수가 런타임동안 여러 타입의 값을 가질 수 있다는 것이 파이썬의 타입 시스템이 약하다는 것은 아니다. 파이썬의 타입 시스템이 동적, 다이나믹 하다는 것은 변수가 특정 타입에 종속되어 불변으로 고정되지 않는다는 것이지, 특정 타입을 가지고 있는 값들의 타입이 런타임동안 마음대로 변할 수 있다는 것은 아니다.
파이썬은 Strongly Typed Language이다.
예를들어, 정수형 1과 문자열 “1”의 더하기 연산은 TypeError를 일으킨다. 이를 피하기 위해서는 필수적으로 명시적 형 변환(Explicit Type Conversion)이 필요하다.

함수

함수를 프로그래밍하는 것은 해당 함수의 기능을 추상화하고 재사용할 수 있다는 점에서 매우 중요하다. 잘 짜여진 함수를 통해 프로그램의 기능들을 모듈화하고 기능 구현에 있어서 작은 문제들의 해결을 통해 큰 목적을 해결할 수 있다.

네임스페이스

파이썬에서 함수가 만들어지면 자신만의 네임스페이스 또한 생성된다. 이를 통해 함수의 내부와 외부를 구분하여 변수의 이름을 정하거나 사용할 수 있다.

문법

def 함수 이름(함수의 파라미터):
    함수 내용

함수 인자

함수의 인자는 함수가 실행될 때 외부에서 받아오는 입력을 의미한다. 파이썬 함수에 입력을 제공하는 방법에는 여러가지가 있다.

위치 인자

함수에 인자를 제공하는 가장 간단한 방법이다. 함수의 정의 부분에 입력 파라미터를 콤마로 구분해 제공하면 함수를 실행하는 부분에서 순서에 맞게 해당 파라미터에 입력값이 들어가게 된다.

정의된 파라미터 수 보다 적은 수나 더 많은 수의 파라미터가 들어가면 에러가 발생한다.

인자에 디폴트 값을 줄 수도 있지만 이 때에는 디폴트 인자가 다른 인자보다 선행할 수 없다. 이유는 당연하다. 디폴트 값을 가진 인자 여러개가 디폴트 값을 가지지 않은 위치 인자 중간에 끼어있다면, 함수에 전달되는 인자들이 디폴트 값을 재설정 하기 위한 것인지 본래 위치 인자에 넣고자 하는 것인지 알아 챌 수 없기 때문이다. 아래 함수가 정의됐다고 가정하고 func_with_default(1,2,3)을 호출하면 b와 c중 무엇이 2로 디폴트 값이 변경되었는지 알 길이 없다.

주의! 가변 디폴트 변수

함수 인자의 디폴트 값은 함수가 정의되었을 때 (즉, def 키워드로 시작하는 함수 정의문이 실행되었을 때) 한 번만 선언된다. 즉 매번 함수 실행시마다 선언되지 않는다.
그래서 함수 인자에 디폴트 값으로 가변 객체(예를들어, 빈 리스트)와 같은 것을 주고 해당 값에 대한 작업을 수행하면 함수가 실행될때마다 파라미터가 초기화되지 않고 변화가 누적된다. 이것을 간과하면 프로그램에서 예기치 않은 오류가 발생할 수 있으니 주의가 필요하다.
이를 해결하기 위해서는 디폴트 값을 None으로 먼저 주고, 디폴트 값이 변하지 않았을 시 함수 내부에서 디폴트 값을 초기화 해주는 방법이 있다.

파이썬의 함수로는 변수가 어떻게 전달될까?

다른 프로그래밍 언어에서는 함수에 인자가 전달되는 방식에 크게 두 가지 방식이 있다. 첫 번째는 값에 의한 전달(call by value), 두 번째는 참조에 의한 전달(call by reference)이다. 값에 의한 전달에서 함수에 전달된 인자 값은 함수 내부에서 어떤 변화를 겪어도 함수를 콜 한 환경에서의 변수에는 영향을 끼치지 못한다. 그러나 참조에 의한 전달의 경우에는 함수 내부에서의 조작이 함수의 콜 환경에 있는 변수가 참조하는 값에 영향을 준다. 파이썬의 경우 어떠할까?
결론부터 말하자면 파이썬은 두 경우 모두에 속하지 않는다. 파이썬의 인자 전달 방식을 할당에 의한 전달 (passed by assignment)라고 한다. 파이썬에서 모든 값은 객체이고 모든 변수는 해당 객체를 가리키고 있을 뿐이다. 예를들어 3이라는 불변 객체를 a 라는 변수가 가리키고 있는 상황을 우리는 a = 3 이라는 파이썬 코드로 표현하는 것이다. 이제 a += 1 이라는 방식으로 a의 값을 변화시켰다고 해보자. 직관적으로는 a 라는 변수가 가리키던 값 3에 1이 더해져서 3이 4로 변화했다고 생각할 수 있으나, 사실은 a가 4라는 다른 새로운 객체를 가리키게 된 것이다.

가변 길이 인자

만일 우리가 구현하고자 하는 함수의 인자 수가 미리 주어지지 않는다면 가변 길이 인자를 사용할 수 있다. 이를 위해 곱셈 연산에 쓰이는 별표 (Asterisk, *)를 컨테이너 타입의 데이터를 풀어내는데(unpack) 사용할 수 있다.

가변 키워드 인자

위치 인자 뿐 아니라 키워드 인자 또한 가변 길이로 전달 가능하다. 이 경우에는 파이썬의 dictionary를 언패킹해서 전달하면 된다.

가변 길이 인자와 가변 키워드 인자를 동시에 전달할 수도 있다. 이 경우에는 가변 길이 인자가 키워드 인자보다 앞서 와야 한다.







- 컬렉션 아티클