
Python 다중 변수
Python에서는 한 번에 여러 변수에 값을 할당하는 다양한 방법을 제공한다. 이러한 기능을 사용하면 코드를 더 간결하고 효율적으로 작성할 수 있으며, 특히 데이터를 다룰 때 매우 유용하다.
여러 변수에 여러 값 할당
Python에서는 한 줄로 여러 변수에 서로 다른 값을 할당할 수 있다.
기본 다중 할당
x, y, z = "Orange", "Banana", "Cherry"
print(x)
print(y)
print(z)
실행 결과는 다음과 같다.
Orange
Banana
Cherry
다양한 데이터 타입 할당
name, age, height, is_student = "홍길동", 25, 175.5, True
print(f"이름: {name}")
print(f"나이: {age}")
print(f"키: {height}cm")
print(f"학생 여부: {is_student}")💡 다중 할당 주의사항:
• 변수의 개수와 값의 개수가 일치해야 한다
• 개수가 맞지 않으면 ValueError가 발생한다
• 순서대로 할당되므로 순서에 주의하자
• 가독성을 위해 너무 많은 변수를 한 번에 할당하지 말자여러 변수에 같은 값 할당
여러 변수에 동일한 값을 할당할 때는 연쇄 할당을 사용한다.
기본 연쇄 할당
[code lang="python"]x = y = z = "Orange"
print(x)
print(y)
print(z)
모든 변수가 같은 값 "Orange"를 가진다.
숫자 연쇄 할당
a = b = c = 0
print(f"a = {a}, b = {b}, c = {c}")
# 각 변수를 개별적으로 수정 가능
a = 10
print(f"a = {a}, b = {b}, c = {c}")연쇄 할당 주의사항
가변 객체(리스트, 딕셔너리 등)의 연쇄 할당은 주의가 필요하다.
[code lang="python"]# 주의: 같은 리스트 객체를 참조
list1 = list2 = list3 = []
list1.append(1)
print(f"list1: {list1}") # [1]
print(f"list2: {list2}") # [1] - 같은 객체를 참조
print(f"list3: {list3}") # [1] - 같은 객체를 참조
# 올바른 방법: 각각 다른 리스트 생성
list1 = []
list2 = []
list3 = []컬렉션에서 값 언패킹
리스트, 튜플 등의 컬렉션에서 값을 추출하여 여러 변수에 할당할 수 있다. 이를 언패킹(Unpacking)이라고 한다.
리스트 언패킹
[code lang="python"]fruits = ["apple", "banana", "cherry"]
x, y, z = fruits
print(x) # apple
print(y) # banana
print(z) # cherry
튜플 언패킹
coordinates = (10, 20)
x, y = coordinates
print(f"x 좌표: {x}")
print(f"y 좌표: {y}")
# 3차원 좌표
point_3d = (5, 10, 15)
x, y, z = point_3d
print(f"3D 좌표: ({x}, {y}, {z})")문자열 언패킹
문자열도 시퀀스이므로 언패킹할 수 있다.
[code lang="python"]word = "ABC"
a, b, c = word
print(a) # A
print(b) # B
print(c) # C
언패킹 오류 처리
언패킹 시 변수 개수와 값의 개수가 맞지 않으면 오류가 발생한다.
개수 불일치 오류
# 오류 발생 예제
fruits = ["apple", "banana", "cherry"]
# x, y = fruits # ValueError: too many values to unpack
# x, y, z, w = fruits # ValueError: not enough values to unpack
# 올바른 사용
x, y, z = fruits
print(f"과일들: {x}, {y}, {z}")안전한 언패킹
[code lang="python"]def safe_unpack(data, expected_count):
"""안전한 언패킹을 위한 함수"""
if len(data) != expected_count:
raise ValueError(f"Expected {expected_count} values, got {len(data)}")
return data
# 사용 예제
try:
fruits = ["apple", "banana"]
x, y, z = safe_unpack(fruits, 3)
except ValueError as e:
print(f"오류: {e}")
# 기본값으로 처리
x, y = fruits
z = "default"
print(f"처리된 값: {x}, {y}, {z}")별표(*) 연산자를 이용한 언패킹
Python 3에서는 별표 연산자를 사용하여 나머지 값들을 하나의 변수에 할당할 수 있다.
기본 별표 언패킹
[code lang="python"]numbers = [1, 2, 3, 4, 5]
first, *middle, last = numbers
print(f"첫 번째: {first}") # 1
print(f"중간 값들: {middle}") # [2, 3, 4]
print(f"마지막: {last}") # 5
다양한 별표 언패킹 패턴
# 앞의 몇 개만 추출
data = [1, 2, 3, 4, 5, 6, 7]
first, second, *rest = data
print(f"첫 번째: {first}, 두 번째: {second}")
print(f"나머지: {rest}")
# 뒤의 몇 개만 추출
*beginning, second_last, last = data
print(f"마지막 두 개: {second_last}, {last}")
print(f"앞의 값들: {beginning}")
# 중간 값들 무시
first, *_, last = data
print(f"첫 번째와 마지막: {first}, {last}")문자열과 별표 언패킹
[code lang="python"]word = "PYTHON"
first, *middle, last = word
print(f"첫 글자: {first}") # P
print(f"중간 글자들: {middle}") # ['Y', 'T', 'H', 'O']
print(f"마지막 글자: {last}") # N
중첩된 구조 언패킹
중첩된 리스트나 튜플도 언패킹할 수 있다.
중첩 튜플 언패킹
# 사용자 정보: (이름, (나이, 키))user_info = ("홍길동", (25, 175))
name, (age, height) = user_info
print(f"이름: {name}")
print(f"나이: {age}")
print(f"키: {height}cm")
# 좌표 정보: [(x1, y1), (x2, y2)]
points = [(10, 20), (30, 40)]
(x1, y1), (x2, y2) = points
print(f"점1: ({x1}, {y1})")
print(f"점2: ({x2}, {y2})")
딕셔너리와 언패킹
# 딕셔너리 키 언패킹person = {"name": "홍길동", "age": 25, "city": "서울"}
name, age, city = person.values()
print(f"이름: {name}, 나이: {age}, 도시: {city}")
# 딕셔너리 아이템 언패킹
for key, value in person.items():
print(f"{key}: {value}")
함수 반환값 언패킹
함수가 여러 값을 반환할 때 언패킹을 사용하여 각각의 변수에 할당할 수 있다.
여러 값을 반환하는 함수
def get_user_info():"""사용자 정보를 반환하는 함수"""
return "홍길동", 25, "서울", True
# 언패킹으로 각 값을 받기
name, age, city, is_active = get_user_info()
print(f"이름: {name}")
print(f"나이: {age}")
print(f"도시: {city}")
print(f"활성 상태: {is_active}")
수학 계산 함수 예제
def calculate_stats(numbers):"""숫자 리스트의 통계를 계산하는 함수"""
total = sum(numbers)
count = len(numbers)
average = total / count if count > 0 else 0
minimum = min(numbers) if numbers else 0
maximum = max(numbers) if numbers else 0
return total, count, average, minimum, maximum
# 함수 사용
data = [10, 20, 30, 40, 50]
total, count, avg, min_val, max_val = calculate_stats(data)
print(f"합계: {total}")
print(f"개수: {count}")
print(f"평균: {avg:.2f}")
print(f"최솟값: {min_val}")
print(f"최댓값: {max_val}")
변수 교환 (Swapping)
Python에서는 임시 변수 없이 간단하게 변수 값을 교환할 수 있다.
두 변수 교환
a = 10b = 20
print(f"교환 전: a={a}, b={b}")
# Python의 우아한 변수 교환
a, b = b, a
print(f"교환 후: a={a}, b={b}")
여러 변수 순환
x, y, z = 1, 2, 3print(f"원래: x={x}, y={y}, z={z}")
# 순환 교환
x, y, z = y, z, x
print(f"순환 후: x={x}, y={y}, z={z}")
# 역순으로 변경
x, y, z = z, y, x
print(f"역순: x={x}, y={y}, z={z}")
실용적인 활용 예제
다중 변수 할당의 실제 활용 사례들을 살펴보자.
CSV 데이터 처리
# CSV 한 줄을 파싱하는 예제csv_line = "홍길동,25,서울,개발자,5000"
name, age, city, job, salary = csv_line.split(",")
# 데이터 타입 변환
age = int(age)
salary = int(salary)
print(f"이름: {name}")
print(f"나이: {age}세")
print(f"거주지: {city}")
print(f"직업: {job}")
print(f"급여: {salary:,}원")
좌표 계산
# 두 점 사이의 거리 계산import math
point1 = (0, 0)
point2 = (3, 4)
x1, y1 = point1
x2, y2 = point2
distance = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
print(f"점 ({x1}, {y1})과 점 ({x2}, {y2}) 사이의 거리: {distance}")
시간 데이터 처리
from datetime import datetime# 현재 시간을 여러 변수로 분해
now = datetime.now()
year, month, day = now.year, now.month, now.day
hour, minute, second = now.hour, now.minute, now.second
print(f"날짜: {year}년 {month}월 {day}일")
print(f"시간: {hour}시 {minute}분 {second}초")
# 시간 문자열 파싱
time_string = "2024-03-15 14:30:45"
date_part, time_part = time_string.split(" ")
year, month, day = date_part.split("-")
hour, minute, second = time_part.split(":")
print(f"파싱된 날짜: {year}/{month}/{day}")
print(f"파싱된 시간: {hour}:{minute}:{second}")
고급 언패킹 기법
더 복잡한 상황에서의 언패킹 활용법을 알아보자.
조건부 언패킹
def process_data(data):"""데이터 길이에 따른 조건부 처리"""
if len(data) >= 3:
first, second, *rest = data
print(f"첫 번째: {first}, 두 번째: {second}")
if rest:
print(f"나머지: {rest}")
elif len(data) == 2:
first, second = data
print(f"두 개 값: {first}, {second}")
elif len(data) == 1:
first, = data # 튜플 언패킹을 위한 쉼표
print(f"하나 값: {first}")
else:
print("데이터가 없습니다")
# 테스트
process_data([1, 2, 3, 4, 5])
process_data([1, 2])
process_data([1])
process_data([])
중첩 함수 호출과 언패킹
def get_name_age():return "홍길동", 25
def get_address():
return "서울", "강남구", "12345"
# 중첩 언패킹
(name, age), (city, district, postal) = get_name_age(), get_address()
print(f"이름: {name}, 나이: {age}")
print(f"주소: {city} {district} (우편번호: {postal})")
💡 다중 변수 활용 팁:
• 가독성을 위해 관련된 변수들만 함께 할당하자
• 별표 연산자는 필요한 경우에만 사용하자
• 언패킹 시 변수명을 의미 있게 지정하자
• 복잡한 중첩 구조는 단계별로 나누어 처리하자
• 오류 처리를 고려하여 안전한 언패킹을 구현하자
성능과 메모리 고려사항
다중 변수 할당 시 성능과 메모리 사용에 대한 고려사항이다.
효율적인 변수 교환
import time# 전통적인 방법 (임시 변수 사용)
def swap_traditional(a, b):
temp = a
a = b
b = temp
return a, b
# Python의 튜플 언패킹 방법
def swap_pythonic(a, b):
a, b = b, a
return a, b
# 성능 비교 (참고용)
a, b = 1000000, 2000000
start = time.time()
for _ in range(1000000):
a, b = swap_pythonic(a, b)
pythonic_time = time.time() - start
print(f"Python 방식 시간: {pythonic_time:.4f}초")
Python의 다중 변수 할당 기능을 활용하면 코드를 더 간결하고 읽기 쉽게 만들 수 있다. 특히 데이터 처리, 함수 반환값 처리, 변수 교환 등에서 매우 유용하다.