Python에서 인수 목록이 있는 함수를 호출하는 방법
Python에서는 별표(*) 연산자를 활용하면 가변 개수의 인수를 하나의 리스트로 받거나, 반대로 리스트를 개별 인수로 풀어서(unpack) 함수에 전달할 수 있습니다. 이 두 가지 동작을 정확히 구분하는 것이 핵심입니다.
1. 함수 정의 시: 나머지 인수를 리스트로 묶기
def baz1(foo, *args):
함수를 정의할 때 매개변수 args 옆에 붙은 별표(*)는 다음과 같은 의미입니다.
"호출 시 전달된 나머지 위치 인수들을 모두 모아서, args라는 이름의 튜플(리스트 형태)에 담아라."즉, baz1(foo2, 2, 3, 4)처럼 호출하면 2, 3, 4가 각각 따로 전달되는 것이 아니라 args = (2, 3, 4)로 묶이게 됩니다.
2. 함수 호출 시: 리스트를 개별 인수로 풀기
반대로 함수를 호출하는 코드에서:
foo(*args)
이때 args 앞에 붙은 별표(*)는 다음과 같은 의미입니다.
"args라는 리스트(또는 튜플)를 풀어서(unwrap), 그 요소들을 개별 위치 인수로 차례대로 전달해라."따라서 foo(*args)는 foo(args[0], args[1], args[2])와 동일하게 동작합니다.
3. 전체 예제 코드
아래 예제에서 baz1은 별표를 사용해 인수를 직접 받고, baz2는 리스트를 명시적으로 전달받습니다. 두 경우 모두 내부적으로 args에는 [2, 3, 4]라는 값이 들어 있다는 점이 중요합니다.
def baz1(foo, *args): # 별표 사용 - 나머지 인수를 args로 묶음
foo(*args)
def baz2(foo, args): # 별표 없음 - 리스트를 그대로 전달받음
foo(*args)
def foo2(x, y, z):
print(x + y + z)
baz1(foo2, 2, 3, 4)
baz2(foo2, [2, 3, 4])실행 결과
9 9
정리
- 정의부의
*args: 여러 개의 인수를 하나의 튜플로 수집(packing)합니다. - 호출부의
*args: 리스트나 튜플을 개별 인수로 분해(unpacking)하여 전달합니다. - Python 3에서는
print가 함수이므로print(x + y + z)처럼 괄호를 사용해야 합니다.
이처럼 별표 연산자의 위치(정의 vs 호출)에 따라 동작이 정반대가 되므로, 두 상황을 명확히 구분해서 이해하면 가변 인수 함수 작성과 활용이 훨씬 쉬워집니다.