1. 뮤터블(mutable) 객체의 대입
뮤터블 객체는 화이트보드와 같습니다. 화이트보드에 글을 쓰고 지우고 다시 쓸 수 있듯이, 뮤터블 객체도 생성 후에 내용을 변경할 수 있습니다. 여러 사람이 같은 화이트보드를 보고 있다면, 한 사람이 내용을 변경하면 모두가 그 변경을 볼 수 있습니다.
- 리스트(list), 딕셔너리(dict), 집합(set) 등이 해당됩니다.
- 객체 생성 후 그 값을 변경할 수 있습니다.
- 대입 시 객체의 참조가 복사됩니다.
"객체의 참조가 복사된다"는 말은 실제 데이터를 복사하는 것이 아니라, 데이터가 저장된 메모리 주소를 복사한다는 의미입니다.
# 뮤터블 객체 (리스트) 예시
original_list = [1, 2, 3]
copied_list = original_list # 참조가 복사됨
print(id(original_list)) # 메모리 주소 출력
print(id(copied_list)) # 위와 같은 메모리 주소 출력
original_list.append(4) # original_list 수정
print(copied_list) # [1, 2, 3, 4] 출력 (copied_list도 변경됨)
이 경우, original_list와 copied_list는 같은 메모리 주소를 가리키고 있습니다. 따라서 하나를 변경하면 다른 하나도 같이 변경됩니다.
- 뮤터블 객체는 객체 생성 후에도 내용을 변경할 수 있습니다.
- 메모리 상의 같은 위치에서 변경이 일어납니다 (새로운 객체를 만들지 않음).
- 여러 변수가 같은 객체를 참조할 경우, 한 변수를 통한 변경이 다른 변수에도 영향을 미칩니다.
2. 이뮤터블(Immutable) 객체의 대입
이뮤터블 객체는 한 번 생성되면 그 내용을 변경할 수 없습니다. 따라서 새로운 값을 대입할 때, 기존 객체를 수정하는 것이 아니라 새로운 객체를 만들어 변수가 그것을 가리키게 합니다.
# 문자열(이뮤터블 객체) 예시
a = "Hello"
print(id(a)) # a의 메모리 주소 출력
a = a + " World" # 새로운 문자열 객체 생성
print(id(a)) # 새로운 메모리 주소 출력 (이전과 다름)
# 정수(이뮤터블 객체) 예시
x = 5
print(id(x)) # x의 메모리 주소 출력
x = x + 1 # 새로운 정수 객체 생성
print(id(x)) # 새로운 메모리 주소 출력 (이전과 다름)
- 문자열(str), 정수(int), 부동소수점(float), 튜플(tuple) 등이 해당됩니다.
- 객체 생성 후 그 값을 변경할 수 없습니다.
- 대입 시 새로운 객체가 생성되어 변수에 할당됩니다.
4. 파이썬의 자료형
# 리스트
fruits = ['사과', '바나나', '오렌지']
fruits[1] = '키위' # 값 변경 가능
print(fruits) # ['사과', '키위', '오렌지']
# 딕셔너리
person = {'이름': '홍길동', '나이': 30}
person['직업'] = '개발자' # 새 키-값 쌍 추가 가능
print(person) # {'이름': '홍길동', '나이': 30, '직업': '개발자'}
# 집합
numbers = {1, 2, 3}
numbers.add(4) # 새 요소 추가 가능
print(numbers) # {1, 2, 3, 4}
뮤터블 자료형 : 리스트, 딕셔너리, 집합등이 있으며 값을 변경할 수 있습니다.
# 수
x = 5
# x[0] = 3 # 오류 발생: 숫자는 인덱싱이나 수정 불가
# 문자열(string)
greeting = "안녕하세요"
# greeting[0] = "잘" # 오류 발생: 문자열은 수정 불가
new_greeting = "잘" + greeting[2:] # 새 문자열 생성은 가능
print(new_greeting) # 잘하세요
# 튜플
coordinates = (10, 20)
# coordinates[0] = 15 # 오류 발생: 튜플은 수정 불가
이뮤터블 자료형 : 수, 문자열, 튜플 등이 있으며 값을 변경할 수 없습니다.
5. 파이썬의 대입
자동 자료형 선언
name = "Alice" # 문자열로 자동 선언
age = 25 # 정수로 자동 선언
height = 165.5 # 실수로 자동 선언
좌변에 변수 이름이 처음 나온 경우, 그 변수에 맞는 자료형으로 자동 선언해 줍니다.
참조대입
a = [1, 2, 3]
b = a # b는 a와 같은 객체를 참조
b[0] = 10 # a도 함께 변경됨
print(a) # [10, 2, 3]
print(b) # [10, 2, 3]
대입식은 값 자체가 아니라 참조하는 객체의 식별 번호를 대입합니다.
여러 변수에 여러 값 동시 대입
x, y, z = 1, 2, 3
print(x, y, z) # 1 2 3
# 리스트 언패킹
coordinates = [10, 20, 30]
x, y, z = coordinates
print(x, y, z) # 10 20 30
여러 변수에 여러 값을 한꺼번에 대입할 수 있습니다.
값 대입
a, b = 5, 10
a, b = b, a # 값 교환
print(a, b) # 10 5
6. 파이썬에서 대입 기호 =는 연산 기호가 아니다.
# 연산 기호 사용 (표현식)
x = 5
y = x + 3 # '+' 는 연산 기호
print(y) # 8
# 대입 기호 사용 (문장)
a = 10
b = (a = 20) # 오류 발생: 대입문은 값을 반환하지 않음
# 비교
print(x + 3) # 정상 작동: 8
print(a = 20) # 오류 발생: 'print'의 인자로 사용할 수 없음
파이썬에서 대입 기호 =는 연산식에서 사용하는 +, * 등과 같이 취급하지 않습니다. 즉, x + 3은 식이지만 x = 3은 식이 아닙니다. 파이썬에서 x + 3은 표현식(expression)이지만 x = 3은 문장(statement)입니다. 참고로 C, C++, Java 등의 언어에서는 =를 결합 연산자로 사용합니다. 헷갈리지 않도록 주의하세요.
'TIL' 카테고리의 다른 글
[TIL] Python 문자열(String)의 불변성(Immutability) (1) | 2024.09.10 |
---|---|
[TIL] 자료 구조와 배열 (Python) 5편 - 리스트와 튜플 활용하기 (1) | 2024.09.10 |
[TIL] 파이썬의 인수 전달 방식 이해하기 (0) | 2024.09.09 |
[TIL] 자료 구조와 배열 (Python) 3편 - 인덱스싱, 슬라이싱 (1) | 2024.09.09 |
[TIL] 자료 구조와 배열 (Python) 2편 - 리스트와 튜플 (3) | 2024.09.09 |