파이썬에서 다중 할당
이란, 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를 차례로 실행하는 것이 아님을 알 수 있다.
할당하고자 하는 우변 객체들을 우선 다 바인딩시킨 후에, 좌변에 있는 변수들이 그 객체들을 각각 참조하게 된다.
세 변수 a = 1, b = 3, c = 5를 서로 스왑한다고 하자.
temp = a
a = b
b = c
c = temp
여러 변수들을 서로 스왑하기 위해서는 위와 같이 임시변수가 반드시 필요하다.
하지만 다중 할당을 통해 임시변수 없이 코드를 더 쉽고 간결하게 작성할 수 있다.
a, b, c = b, c, a
>>> u, v = 7, u
NameError: name 'u' is not defined
에러의 원인은 간단하다.
우변의 u에 바인딩될 객체가 아직 없다.
이러한 경우에는 아래와 같이 분기하여 할당해야 한다.
u = 7
v = u
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
이러한 다중 할당의 동작 원리는 파이썬의 중요한 특징 중 하나이다.
a. 다중 할당을 잘 이해함으로써 코드를 더 간결하게 작성할 수 있으며
b. 적절한 [다중/분기] 할당을 통해 변수를 [한 번에/별도로] 저장하여 의도한 바를 올바르게 구현할 수 있도록 주의해야 한다.