47.15 할당 표현식 사용하기

할당 표현식(assignment expression)은 표현식 안에서 변수에 값을 할당하는 방법입니다. :=와 같이 사용하며 바다 코끼리 연산자(walrus operator)라고도 부릅니다. :=에서 :은 눈, =은 엄니를 닮았다고 해서 붙여진 이름입니다.

:=은 파이썬 3.8 이상부터 사용 가능

변수 := 

다음과 같이 hello의 길이를 구한 뒤 10 이상이면 length의 값과 "10 이상"이라는 문자열을 출력합니다.

hello = 'Hello, world!'
 
length = len(hello)
if length >= 10:
    print(f'length는 {length}, 10 이상')

실행 결과

length는 13, 10 이상

이 코드의 if 조건식 부분을 할당 표현식으로 바꾸면 다음과 같이 작성할 수 있습니다.

if_assignment_expression.py

hello = 'Hello, world!'
 
if (length := len(hello)) >= 10:
    print(f'length는 {length}, 10 이상')

실행 결과

length는 13, 10 이상

if (length := len(hello)) >= 10:과 같이 if 조건문 안에서 length := len(hello)len의 결과 값을 변수 length에 할당하면서 >= 10으로 length의 값이 10 이상인지 판단할 수 있습니다. 이때 if (length := len(hello)) >= 10:과 같이 할당 표현식 부분을 괄호로 묶어주어야 하며 if length := len(hello) >= 10:처럼 괄호를 생략하면 조건식 len(hello) >= 10이 먼저 계산되어 length 에는 조건식의 결과 값인 True가 할당되므로 주의해야 합니다. 이렇게 할당 표현식은 변수 length 할당과 >= 10 조건 판단을 동시에 할 수 있어서 코드를 간결하게 작성할 수 있습니다.

만약 다음과 같이 조건식이 없을 경우에는 괄호를 생략할 수 있습니다.

if_assignment_expression_without_parentheses.py

hello = []
 
if length := len(hello):
    print(f'length는 {length}, 리스트에 요소가 있음')
else:
    print(f'length는 {length}, 리스트에 요소가 없음')

실행 결과

length는 0, 리스트에 요소가 없음

이번에는 while 반복문에 할당 표현식을 사용해보겠습니다. 다음은 i = random.randint(1, 6)으로 1과 6 사이의 난수를 생성하면서 i 값이 3이 아닐 때 계속 반복합니다(3이면 반복 중지).

import random
 
i = 0
while i != 3:    # 3이 아닐 때 계속 반복
    i = random.randint(1, 6)    # randint를 사용하여 1과 6 사이의 난수를 생성
    print(i)

이 코드의 while 반복문 부분을 할당 표현식으로 바꾸면 다음과 같이 작성할 수 있습니다.

while_assignment_expression.py

import random
 
while (i := random.randint(1, 6)) != 3:  # 1과 6 사이의 난수 생성 후 3이 아닐 때 반복
    print(i)

while (i := random.randint(1, 6)) != 3:과 같이 while 반복문 안에서 random.randint(1, 6)의 결과 값을 i에 저장하면서 i의 값이 3이 아닐 때 반복하도록 하였습니다(3이면 반복 중지). 마찬가지로 조건문을 사용할 때는 (i := random.randint(1, 6))처럼 할당 표현식 부분을 괄호롤 묶어주어야 합니다.

할당 표현식은 리스트 안에서도 사용할 수 있습니다.

def ten():
    return 10
 
a = ten()
b = [a, a + 1, a + 2]
print(b)

실행 결과

[10, 11, 12]

함수 ten은 10을 반환하여 변수 a에 할당하고, [a, a + 1, a + 2]와 같이 두 번째 요소부터 숫자를 더해서 리스트를 만들었습니다.

이제 리스트 안에서 할당 표현식을 사용해보겠습니다.

list_assignment_expression.py

def ten():
    return 10
 
b = [a := ten(), a + 1, a + 2]
print(b)

실행 결과

[10, 11, 12]

리스트의 첫 번째 요소에서 할당 표현식 a := ten()으로 변수 a를 할당하면 두 번째 요소부터는 a를 그대로 사용하여 리스트를 만들 수 있습니다. 물론 b = (a := ten(), a + 1, a + 2)와 같이 튜플 안에서도 할당 표현식을 사용할 수 있습니다.