다중 할당은 편하다.
그런데 링크드 리스트(Linked List)에서 헷갈리는 부분이 있어 정리해본다.
x, y = 1, 2와 y, x = 2, 1은 같은 결과를 주지만,
node1, node1.next = node2, node2.next와
node1.next, node1 = node2.next, node2는 그렇지 않다.
처음에는 너무 헷갈렸지만 이제 정리가 되었다.
핵심은,
우변은 미리 평가하여 그 값을 '임시 메모리'에 넣어 두고
좌변은 왼쪽부터 순서대로 대입하게 된다.
따라서 다중 할당 과정에서 우변은 변하지 않고 좌변은 변할 수 있다.
아래는 GPT의 도움을 받아 정리한 내용이다.
# 파이썬의 다중할당 (Multiple Assignment)
# 1. 기본적인 다중할당
a, b, c = 1, 2, 3
print(a, b, c) # 출력: 1 2 3
# 2. 값 교환 (swap)
x, y = 10, 20
x, y = y, x
print(x, y) # 출력: 20 10
# 3. 리스트나 튜플에서 다중할당
data = [4, 5, 6]
a, b, c = data
print(a, b, c) # 출력: 4 5 6
# 4. 별표(*)를 이용한 가변길이 할당
a, *b, c = [1, 2, 3, 4, 5]
print(a) # 출력: 1
print(b) # 출력: [2, 3, 4]
print(c) # 출력: 5
# 5. 다중할당으로 동일한 값 할당
x = y = z = 0
print(x, y, z) # 출력: 0 0 0
# 주의사항
# 1. 값과 변수의 개수는 일치해야 함
# a, b = 1 # 오류 발생: 값이 하나 부족합니다.
# 2. 가변길이 할당의 유연성
# 별표를 사용한 변수는 0개 이상의 값을 받을 수 있음
a, *b, c = [1, 2]
print(a) # 출력: 1
print(b) # 출력: []
print(c) # 출력: 2
Linked List)에서 다중 할당 예시class ListNode:
def __init__(self, value=0, next=None):
self.value = value
self.next = next
# 링크드 리스트 생성
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)
# 연결: node1 -> node2 -> node3 -> node4
node1.next = node2
node2.next = node3
node3.next = node4
# 예제 1: node1, node1.next = node2, node2.next
node1, node1.next = node2, node2.next
# 실행 순서:
# 1. node2와 node2.next(node3)가 먼저 평가됨.
# 2. node1이 node2를 가리키게 됨.
# 3. node1.next가 node3이 됨.
# 출력 확인
print("예제 1 결과:")
print(f"node1: {node1.value}, node1.next: {node1.next.value}") # 출력: node1: 2, node1.next: 3
print(f"node2.next: {node2.next.value}") # 출력: node2.next: 3
# 상태 복원
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)
node1.next = node2
node2.next = node3
node3.next = node4
# 예제 2: node1.next, node1 = node2.next, node2
node1.next, node1 = node2.next, node2
# 실행 순서:
# 1. node2.next(node3)와 node2가 먼저 평가됨.
# 2. node1.next가 node3으로 설정됨 (기존 node1 기준).
# 3. node1이 node2를 가리키게 됨.
# 출력 확인
print("예제 2 결과:")
print(f"node1: {node1.value}, node1.next: {node1.next.value}") # 출력: node1: 2, node1.next: 4
print(f"node2.next: {node2.next.value}") # 출력: node2.next: 3