바이트 문자열의 불변 객체 특성으로 발생할 수 있는 상황을 이해합니다.
목차
개발 의도
# 바이트 문자열 생성
byte_str = b"hello"
print("byte string:", byte_str)
# 바이트 문자열 생성
byte_str[0] = b"a"
print("byte string:", byte_str)
# 출력값: TypeError: 'bytes' object does not support item assignment
- 위와 같이 바이트 문자열을 생성하고, 첫 글자를 수정합니다.
- 최종 출력값은 b"aello"가 되어야 합니다.
문제 상황
- 위 함수를 실행했을 때, 최종 출력값이
TypeError: 'bytes' object does not support item assignment
가 되는 상황이 발생합니다.
바이트 문자열은 불변 객체
- 파이썬에서 바이트 문자열은 불변(immutable) 객체입니다.
- 불변성의 의미는 객체를 생성한 이후에는 그 값을 수정할 수 없다는 것입니다.
바이트 문자열은 불변 객체(immutable)
# 바이트 문자열 생성
byte_str = b"hello"
print("Original byte string:", byte_str)
# 출력값: Original byte string: b'hello'
# 바이트 문자열의 요소를 수정하려고 하면 오류가 발생
try:
byte_str[0] = b"a" # 바이트 문자열은 수정할 수 없음
except TypeError as e:
print("Error:", e)
# 출력값: Error: 'bytes' object does not support item assignment
- 바이트 문자열(b"hello")은 불변 객체이기 때문에,
byte_str[0] = b"a"와 같은 코드는 TypeError를 발생시킵니다.
# 바이트 문자열 생성
byte_str = b"hello"
# 수정이 필요할 경우 새로운 바이트 문자열을 생성해야 함
new_byte_str = b"a" + byte_str[1:]
print("Modified byte string:", new_byte_str)
# 출력값: Modified byte string: b'aello'
- 바이트 문자열을 수정하려면 기존 객체를 수정하는 것이 아니라,
조합을 통해 새로운 바이트 문자열 객체를 생성해야 합니다.
바이트 배열(bytearray)은 가변 객체(mutable)
data = b"hello"
# 바이트 배열로 변환 (가변 객체)
byte_array = bytearray(data)
# 0번째 값을 b"a"으로 변경
byte_array[0] = 97
# 다시 바이트 문자열로 변환 (불변 객체)
data = bytes(byte_array)
print(data) # 변경된 바이트 문자열 출력
# 출력값: b'aello'
- 바이트 문자열은 불변이지만, 바이트 배열(bytearray)은 가변(mutable) 객체입니다.
- 따라서 바이트 문자열을 수정하고 싶을 때,
이를 바이트 배열로 변환한 후 변경을 수행하고,
다시 바이트 문자열로 변환하는 방법을 사용할 수 있습니다.
- 단, 바이트 배열의 요소는 반드시 정수로 지정해야 하기 때문에,
byte_array[0] = b"a" 대신 byte_array[0] = 97을 사용합니다.
(b"a"는 아스키(ASCII) 코드에서 10진수 97에 해당합니다.)
바이트 배열이 가변인 이유
- 대용량 데이터나 빈번한 데이터 조작 작업에서 유용합니다.
- 바이트 배열을 사용하면 기존 메모리 공간에서 직접 데이터를 변경할 수 있으므로,
새로운 객체를 생성할 필요가 없습니다.
이는 메모리 사용량을 줄이고 프로그램의 성능을 향상시킵니다.
문제 원인 파악
- 즉, 바이트 문자열이 불변 함수이기 때문에
바이트 문자열을 수정할 때, 의도한 것과 다르게 오류가 발생합니다.
아래 코드로 디버깅 완료
data = b"hello"
# 바이트 배열로 변환 (가변 객체)
byte_array = bytearray(data)
# 0번째 값을 b"a"으로 변경
byte_array[0] = 97
# 다시 바이트 문자열로 변환 (불변 객체)
data = bytes(byte_array)
print(data) # 변경된 바이트 문자열 출력
# 출력값: b'aello'
- 바이트 문자열을 바이트 배열로 변환하여 원하는 값으로 수정합니다.
- 이 방법을 사용하면 바이트 문자열을 "수정한" 것처럼 보이지만,
실제로는 새로운 바이트 문자열을 생성하는 것입니다.
'개발 > 오늘의 개발일지' 카테고리의 다른 글
[Python] 하나의 변수에 여러 스레드가 접근하는 것을 막기 위한 Lock 이해하기 (1) | 2024.11.14 |
---|---|
[Python] 반복문과 Lambda: 값 캡처와 변수 참조의 차이 이해하기 (2) | 2024.11.12 |