파이썬에 배열에 값을 추가하는 방법은 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 증가시키며 넣는다.
'python' 카테고리의 다른 글
Python - yield (0) | 2024.12.10 |
---|---|
Python - 멀티스레드, GIL (Global Interpreter Lock) (0) | 2024.11.25 |
Python mutable 변경 가능, immutable 변경 불가능 (0) | 2024.09.23 |
Python 잘 쓰는법: 리스트, 딕셔너리 (1) | 2024.09.09 |
Python 다중 상속, super() (0) | 2024.09.02 |