는 extend
하지 +
를 호출하는 것과 같습니다.
- 반복 가능한 코드로
extend
을 호출 할 수 있습니다.
- 다른 목록에는
+
만 사용할 수 있습니다.
나는이 결정이 만들어진 이유를 추측 할 수 있지만 성능상의 이유로 상상할 수 있습니다. +
을 호출하면 새로운 개체가 생성되고 모든 항목이 복사되는 반면, extend
은 기존 목록 개체의 여유 공간을 사용하여 복사본을 저장하는 경우가 있습니다.
이 결정의 또 다른 부작용은 x += y
이라고 쓰면 목록에 다른 참조가 표시되지만, x = x + y
을 사용하면 변경되지 않습니다. 이 아래에 설명된다 :
>>> x = ['a','b']
>>> y = ['c', d']
>>> z = x
>>> x += y
>>> z
['a', 'b', 'c', 'd']
>>> x = ['a','b']
>>> y = ['c', d']
>>> z = x
>>> x = x + y
>>> z
['a', 'b']
참조
Python source code for list합니다. +=
에 대한
소스 코드 :
static PyObject *
list_inplace_concat(PyListObject *self, PyObject *other)
{
PyObject *result;
result = listextend(self, other);
if (result == NULL)
return result;
Py_DECREF(result);
Py_INCREF(self);
return (PyObject *)self;
}
소스 코드 +
의 경우 : 거꾸로 그것에 대해 생각하고
static PyObject *
list_concat(PyListObject *a, PyObject *bb)
{
Py_ssize_t size;
Py_ssize_t i;
PyObject **src, **dest;
PyListObject *np;
if (!PyList_Check(bb)) {
PyErr_Format(PyExc_TypeError,
"can only concatenate list (not \"%.200s\") to list",
bb->ob_type->tp_name);
return NULL;
}
// etc ...
나는 귀하의 질문에 "동의"합니다. 이것은 나를 위해 연산자 오버로딩에 대한 좋은 논쟁이다. – u0b34a0f6ae
편집 후 내 답변을 삭제했습니다. 목록과 반복 가능 목록 사이에 + 지원하지 않는 이유에 대해 궁금해하는 것 같습니다. 저의 실수입니다. "그래, 왜 안되니?"라고 대답하는 것 외에는 대답이 없습니다. –
이것은 * major * 파손입니다. 보다 일반적으로 동일하게 보이는 운영자에게 다른 행동을 정의하는 언어 또는 라이브러리는 사용자 적대적으로 간주되어야합니다. 문자열 연결에'+'를 사용하는 사람은 아무도 없습니다 : 그 연산은 교환 가능하지 않습니다! –