프로그래밍Python 개발자

Python에서 'walrus' 연산자 (':=')는 어떻게 작동하며, 왜 도입되었고, 사용 시의 주의사항과 일반적인 실수는 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변

Walrus 연산자 (:=), 또는 표현식 할당 연산자는 Python 3.8 버전부터 등장했습니다. 이 연산자는 변수에 값을 직접 할당할 수 있도록 하여, 반복문이나 if 문과 같은 표현식 내에서 함수의 결과나 계산 결과를 즉시 얻고 사용할 수 있게 해줍니다. 즉, 같은 호출을 두 번 반복할 필요가 없게 됩니다.

Walrus가 해결하는 문제는 연산을 중복하거나 할당을 위해 불필요한 코드 라인을 작성해야 하는 필요성입니다. 이전에는 별도의 호출을 하고 그 결과를 사용하는 방식이었으므로, 코드가 더 길어질 수밖에 없었습니다.

해결책: 이제 조건문 내에서 직접 변수를 할당할 수 있으므로 코드가 더 간결하고 때로는 더 읽기 쉽게 됩니다. 다만, walrus를 과도하게 사용하면 특히 경험이 적은 동료들에게 코드를 이해하기 어렵게 만들 수 있다는 점을 기억해야 합니다.

코드 예시:

while (line := input('문자열 입력: ')) != 'exit': print(f'입력한 내용: {line}')

주요 특징:

  • 하나의 표현식 내에서 변수를 선언하고 사용할 수 있게 해줍니다 (예: 조건문 내에서)
  • 반환값의 모든 유형과 작동합니다
  • 주의해서 사용해야 합니다: 간결함 때문에 가독성을 저해하지 않도록

함정 질문.

Walrus 연산자를 사용하여 전역 변수에 값을 할당할 수 있나요?

네, 가능합니다. 그러나 walrus는 적용된 범위에서 작동하므로 LEGB 규칙을 기억하고 함수 외부에서 변수를 조심스럽게 사용하는 것이 중요합니다.

x = expr과 (x := expr)의 차이는 무엇인가요?

x = expr은 독립적인 할당 문장이지만, (x := expr)은 다른 표현식 내에서 expr의 결과를 반환하고 x에 할당하는 표현식입니다. 많은 경우 두 번째 형식은 if 조건문, while 반복문 또는 리스트 표현식에서 사용할 수 있습니다.

Walrus는 리스트 표현식 및 제너레이터 내에서 사용할 수 있나요?

네, walrus는 comprehension에서 인기가 있으며, 이는 반복 계산을 피하는 데 특히 유용합니다.

numbers = [int(s) for s in ['1', '2', '3', '4'] if (n := int(s)) > 2] # 여기서 n은 int(s)의 결과를 저장하여 계산을 절약합니다

일반적인 실수 및 안티 패턴

  • 복잡한 표현식에서의 walrus 과다 사용
  • 가독성을 저해하는 조건 내 할당
  • 결과의 범위 이해 부족

실제 예시

부정적 사례

개발자가 여러 중첩된 walrus와 함께 긴 if 문을 작성합니다:

if (a := get_a()) and (b := a.get_b()) and (c := b.do_c()): print(c)

장점:

  • 코드가 간결합니다.

단점:

  • 읽기 어렵고 디버깅 및 유지보수가 어렵습니다.

긍정적 사례

계산 절약과 가독성을 위해 의식적으로 사용하는 경우:

while (line := sys.stdin.readline()) != '': process(line)

장점:

  • 읽기 쉽고 간결하며 계산을 절약합니다.

단점:

  • 구문과 범위를 이해할 필요가 있습니다.