python

Python list append, extend, +=

Jueuunn7 2024. 10. 7. 08:55

파이썬에 배열에 값을 추가하는 방법은 append, extend, +=, insert 등등이 있습니다.

그 중 append, extende, +=의 차이점을 알아보겠습니다.

1. append, +=

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.append(b)
>>> print(a)
[1, 2, 3, [4, 5, 6]]

append를 사용할 시 그 자체를 배열에 원소로 넣습니다.

+= 연산자를 사용해도 append와 같은 방식으로 동작합니다.

무엇을 넣든 원소 하나로 들어가는 특징이 있습니다.

 

2. extend

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.extend(b)
>>> print(a)
[1, 2, 3, 4, 5, 6]

extend를 사용하면 배열에 iterable을 넣습니다.

 

그럼 2차원 배열은 어떻게 동작할까요?

>>> a = [1, 2, 3]
>>> b = [3, [4, 5]]
>>> a.extend(b)
>>> print(a)
[1, 2, 3, 3, [4, 5]]

 

문자열은 어떻게 동작할까요?

>>> a = [1, 2, 3]
>>> b = '456'
>>> a.extend(b)
>>> print(a)
[1, 2, 3, '4', '5', '6']

 

3. CPython

1. append

int
_PyList_AppendTakeRefListResize(PyListObject *self, PyObject *newitem)
{
    Py_ssize_t len = Py_SIZE(self);  // list의 사이즈 가져오기
    assert(self->allocated == -1 || self->allocated == len);
    if (list_resize(self, len + 1) < 0) {  // list의 사이즈를 1 증가시킨다
        Py_DECREF(newitem);
        return -1;
    }
    FT_ATOMIC_STORE_PTR_RELEASE(self->ob_item[len], newitem);  // 아이템을 추가
    return 0;
}

int
PyList_Append(PyObject *op, PyObject *newitem)
{
    if (PyList_Check(op) && (newitem != NULL)) {  // list인지 item이 null 인지 검사
        int ret;
        Py_BEGIN_CRITICAL_SECTION(op);  // 임계구역 (다중 스레드시 동시에 수정을 막기 위함)
        ret = _PyList_AppendTakeRef((PyListObject *)op, Py_NewRef(newitem));
        Py_END_CRITICAL_SECTION();
        return ret;
    }
    PyErr_BadInternalCall();
    return -1;
}

append는 리스트의 크기를 1 증가시키며 넣는다.