[Python] 다중 할당(Multiple Assignments)

hysong·2022년 7월 14일
0

Python

목록 보기
3/5

📌 Meaning.

파이썬에서 다중 할당이란, 2개 이상의 객체들을 2개 이상의 변수에 동시에 할당하는 것이다.

x, y = 1, 2
>>> x
1
>>> y
2

다음 두 코드의 차이점을 통해 다중 할당을 더 잘 이해할 수 있다.
x = y  # x = 2
y = x  # y = 2
x, y = y, x

1번 코드는 x, y 값이 모두 2가 되어 스왑에 실패하고, 2번 코드는 x, y 값이 2, 1이 되어 스왑에 성공한다.

즉, 2번 코드가 단순히 x = y, y =x를 차례로 실행하는 것이 아님을 알 수 있다.
할당하고자 하는 우변 객체들을 우선 다 바인딩시킨 후에, 좌변에 있는 변수들이 그 객체들을 각각 참조하게 된다.

📌 Pros.

세 변수 a = 1, b = 3, c = 5를 서로 스왑한다고 하자.

temp = a
a = b
b = c
c = temp

여러 변수들을 서로 스왑하기 위해서는 위와 같이 임시변수가 반드시 필요하다.

하지만 다중 할당을 통해 임시변수 없이 코드를 더 쉽고 간결하게 작성할 수 있다.

a, b, c = b, c, a
  1. 우변 b, c, a에 각각 3, 5, 1 객체가 바인딩
  2. 좌변 a, b, c가 우변에 바인딩된 3, 5, 1 객체를 각각 참조

📌 다중 할당 vs 분기 할당

ex 1.

>>> u, v = 7, u
NameError: name 'u' is not defined

에러의 원인은 간단하다.
우변의 u에 바인딩될 객체가 아직 없다.

이러한 경우에는 아래와 같이 분기하여 할당해야 한다.

u = 7
v = u

ex 2.

class Node:
    def __init__(self, val=None, link=None):
        self.val = val
        self.link = link
        
    def __str__(self):
        return f"{self.val}->{self.link.val}"


z = Node("z", Node())
y = Node("y", z)
x = Node("x", y)
>>> print(x)
x->y
>>> print(y)
y->z
>>> print(z)
z->None

세 노드들이 x -> y -> z -> None으로 연결되어 있다.

이 상태에서 아래 두 코드를 각각 실행했을 때, 2번 코드는 1번 코드를 단순히 분기만 시킨 것임에도 불구하고 그 결과가 다르게 나타난다.

x, y, z = y, x, y.link

# x.info() : y->z
# y.info() : x->y
# z.info() : z->None
x, y = y, x
z = y.link

# x.info() : y->z
# y.info() : x->y
# z.info() : y->z

📌 Conclusion.

이러한 다중 할당의 동작 원리는 파이썬의 중요한 특징 중 하나이다.

a. 다중 할당을 잘 이해함으로써 코드를 더 간결하게 작성할 수 있으며
b. 적절한 [다중/분기] 할당을 통해 변수를 [한 번에/별도로] 저장하여 의도한 바를 올바르게 구현할 수 있도록 주의해야 한다.

0개의 댓글