array — 숫자 값의 효율적인 배열
array — 숫자 값의 효율적인 배열
이 모듈은 문자, 정수, 부동소수점 수 같은 기본 값들의 배열을 컴팩트하게 표현하는 객체 타입을 정의해요. 배열은 가변 시퀀스 타입이고 리스트와 매우 비슷하게 동작하지만, 저장되는 객체의 타입이 제한된다는 점이 달라요. 타입은 객체 생성 시 타입 코드(type code) 라는 한 글자로 지정해요. 정의된 타입 코드는 다음과 같아요.
| Type code | C Type | Python Type | 최소 크기(바이트) | Notes |
|---|---|---|---|---|
| 'b' | signed char | int | 1 | |
| 'B' | unsigned char | int | 1 | |
| 'u' | wchar_t | Unicode character | 2 | (1) |
| 'w' | Py_UCS4 | Unicode character | 4 | (2) |
| 'h' | signed short | int | 2 | |
| 'H' | unsigned short | int | 2 | |
| 'i' | signed int | int | 2 | |
| 'I' | unsigned int | int | 2 | |
| 'l' | signed long | int | 4 | |
| 'L' | unsigned long | int | 4 | |
| 'q' | signed long long | int | 8 | |
| 'Q' | unsigned long long | int | 8 | |
| 'f' | float | float | 4 | |
| 'd' | double | float | 8 |
참고:
- (1) 플랫폼에 따라 16비트 또는 32비트일 수 있어요. 3.9부터
array('u')는 deprecated된 Py_UNICODE 대신 wchar_t를 C 타입으로 사용해요. 3.3부터, 3.16에서 제거 예정: 'w' 타입 코드로 마이그레이션하세요. - (2) 3.13 추가.
ctypes와 struct 모듈, 그리고 numpy 같은 서드파티 모듈도 비슷하지만 약간 다른 타입 코드를 사용해요. 값의 실제 표현은 머신 아키텍처(정확히는 C 구현)에 의해 결정되고, 실제 크기는 array.itemsize 속성으로 접근할 수 있어요.
본문
모듈 항목
array.typecodes: 사용 가능한 모든 타입 코드를 담은 문자열이에요.
class array.array(typecode[, initializer])
항목이 typecode로 제한되는 새 배열이에요. 선택적 initializer는 bytes 또는 bytearray 객체, 유니코드 문자열, 또는 적절한 타입의 요소를 반복하는 iterable이어야 해요.
bytes/bytearray객체면frombytes()메서드로 전달되고,- 유니코드 문자열이면
fromunicode()메서드로 전달되며, - 그 외에는 initializer의 iterator가
extend()메서드로 전달돼 초기 항목을 추가해요.
배열 객체는 인덱싱, 슬라이싱, 결합, 곱셈 같은 일반적인 가변 시퀀스 연산을 지원해요. 슬라이스 할당을 쓸 때는 할당값이 같은 타입 코드의 배열 객체여야 해요. 그 외 모든 경우에는 TypeError가 발생해요. 배열 객체는 버퍼 인터페이스도 구현해서 bytes-like 객체가 지원되는 곳 어디든 사용할 수 있어요. 배열은 내용의 타입에 대해 제네릭이에요. 감사 이벤트 array.__new__를 typecode, initializer 인자로 발생시켜요.
속성과 메서드
typecode: 배열 생성에 사용된 타입 코드 문자.itemsize: 내부 표현에서 배열 항목 하나의 바이트 길이.append(value, /): 배열 끝에 지정값의 새 항목을 추가.buffer_info(): 현재 메모리 주소와 배열 내용을 담는 버퍼의 요소 수(length)인(address, length)튜플을 반환. 메모리 버퍼 크기(바이트)는array.buffer_info()[1] * array.itemsize로 계산. 메모리 주소가 필요한 저수준(본질적으로 안전하지 않은) I/O 인터페이스(예: 일부ioctl()연산)에서 가끔 유용. 배열이 존재하고 길이 변경 연산이 적용되지 않는 동안 반환된 숫자는 유효. C/C++ 코드에서 쓸 때는 buffer 인터페이스를 쓰는 게 더 낫고, 이 메서드는 하위 호환을 위해 유지되므로 새 코드에선 피하는 게 좋아.byteswap(): 배열의 모든 항목을 "byteswap"해요. 크기가 1, 2, 4, 8바이트인 값에서만 지원되고, 다른 타입은RuntimeError. 바이트 순서가 다른 머신에서 쓴 파일을 읽을 때 유용.count(value, /): 배열에서value의 발생 횟수 반환.extend(iterable, /): iterable의 항목을 배열 끝에 추가. iterable이 다른 배열이면 정확히 같은 타입 코드여야 하고, 아니면TypeError.frombytes(buffer, /): bytes-like 객체의 내용을 머신 값 배열로 해석해 항목을 추가 (마치fromfile()로 파일에서 읽은 것처럼). (3.2에서 fromstring()이 frombytes()로 이름 변경)fromfile(f, n, /): 파일 객체f에서 n개 항목(머신 값으로)을 읽어 배열 끝에 추가. n개 미만이면EOFError가 발생하지만, 사용 가능했던 항목은 여전히 삽입돼요.fromlist(list, /): 리스트에서 항목 추가.for x in list: a.append(x)와 동등하지만 타입 오류 시 배열이 변하지 않는 게 다름.fromunicode(ustr, /): 주어진 유니코드 문자열의 데이터로 배열 확장. 배열 타입 코드가 'u' 또는 'w'여야 하고, 아니면ValueError. 다른 타입의 배열에 유니코드 데이터를 추가하려면array.frombytes(unicodestring.encode(enc))사용.index(value[, start[, stop]]): 배열에서value의 첫 발생 인덱스인 가장 작은 i를 반환. start/stop으로 부분 검색 가능. 못 찾으면ValueError. (3.10에서 start/stop 추가)insert(index, value, /): 위치index앞에 새 항목value를 삽입. 음수는 배열 끝 기준.pop(index=-1, /): 인덱스 i의 항목을 제거하고 반환. 기본값 -1로 마지막 항목을 제거·반환.remove(value, /):value의 첫 발생 제거.clear(): 배열의 모든 요소 제거. (3.13 추가)reverse(): 배열 항목 순서 뒤집기.tobytes(): 배열을 머신 값 배열로 변환하고 bytes 표현 반환 (tofile()이 파일에 쓰는 것과 같은 바이트 시퀀스). (3.2에서 tostring()이 tobytes()로 이름 변경)tofile(f, /): 모든 항목(머신 값으로)을 파일 객체f에 쓰기.tolist(): 같은 항목을 가진 일반 리스트로 변환.tounicode(): 배열을 유니코드 문자열로 변환. 타입이 'u' 또는 'w'여야 하고 아니면ValueError. 다른 타입에선array.tobytes().decode(enc)사용.
문자열 표현
배열 객체의 문자열 표현은 array(typecode, initializer) 형태예요. initializer는 배열이 비어 있으면 생략되고, typecode가 'u'/'w'면 유니코드 문자열, 아니면 숫자 리스트예요. 이 문자열 표현은 from array import array로 클래스를 import했다면 eval()로 같은 타입·값의 배열로 되돌릴 수 있다는 게 보장돼요. 부동소수점 값이 있으면 inf와 nan 변수도 정의되어야 해요.
array('l')
array('w', 'hello \u2641')
array('l', [1, 2, 3, 4, 5])
array('d', [1.0, 2.0, 3.14, -inf, nan])
참고: struct 모듈(이질적 바이너리 데이터의 패킹/언패킹)과 NumPy(또 다른 배열 타입 정의)도 함께 보세요.