Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 튜플을 C 배열로 변환하는 방법

Python 튜플과 C 배열의 차이 이해하기

Python의 튜플(tuple)은 본질적으로 변경 불가능한(immutable) 요소들의 배열입니다. 반면 C 언어에서는 메모리를 직접 다루기 때문에 '변경 불가능한 배열'이라는 개념 자체가 존재하지 않습니다.

따라서 튜플이 가진 불변성(immutable) 속성까지 그대로 유지한 채 C 배열로 변환하는 것은 불가능합니다. C에서 배열을 정의할 수는 있지만, 그 결과는 튜플보다는 오히려 리스트(list)에 가까운 형태가 됩니다.

C에서 배열을 정의하는 방식

C에서는 다음과 같이 배열을 선언하고 값을 복사해 넣을 수 있습니다.

#include <stdio.h>

int main(void) {
    int arr[] = {1, 2, 3, 4, 5};  // Python 튜플 (1, 2, 3, 4, 5)에 해당
    int size = sizeof(arr) / sizeof(arr[0]);

    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

위 코드에서 arr는 선언 후에도 포인터를 통해 얼마든지 값이 수정될 수 있습니다. 즉, C 배열에는 튜플의 핵심 특징인 불변성이 없습니다.

Python C API를 활용한 접근

Python 코드와 C 코드를 연동해야 한다면, Python C API의 PyTuple_GetItem() 함수를 사용해 튜플의 각 요소를 하나씩 읽어와 C 배열에 복사하는 방식으로 처리할 수 있습니다.

#include <Python.h>

void copy_tuple_to_array(PyObject *tuple) {
    Py_ssize_t size = PyTuple_Size(tuple);
    long *arr = malloc(size * sizeof(long));

    for (Py_ssize_t i = 0; i < size; i++) {
        PyObject *item = PyTuple_GetItem(tuple, i);  // 빌린 참조(borrowed reference)
        arr[i] = PyLong_AsLong(item);
    }
    // arr 사용 후 free(arr)로 메모리 해제 필요
}

정리

  • 튜플의 불변성 속성까지 유지한 C 배열 변환은 불가능합니다.
  • C 배열은 정의 후 값 변경이 가능하므로, 성격상 리스트에 더 가깝습니다.
  • 불변성이 꼭 필요하다면 C 코드 내에서 const 한정자를 활용해 의도적으로 변경을 제한하는 방법을 고려할 수 있습니다.