Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 인수 목록으로 함수 호출하는 방법: *args 언패킹 완벽 이해

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 호출)에 따라 동작이 정반대가 되므로, 두 상황을 명확히 구분해서 이해하면 가변 인수 함수 작성과 활용이 훨씬 쉬워집니다.