Существует явная проверка для типа list
(или его дочерних элементов) в исходном коде python (поэтому даже tuple
не подходит):
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;
}
, поэтому python может очень быстро вычислить размери перераспределить результат, не пытаясь найти все контейнеры или выполнить итерацию справа, чтобы обеспечить быстрое добавление списка.
#define b ((PyListObject *)bb)
size = Py_SIZE(a) + Py_SIZE(b);
if (size < 0)
return PyErr_NoMemory();
np = (PyListObject *) PyList_New(size);
if (np == NULL) {
return NULL;
}
Один из способов обойти это - использовать расширение / добавление на месте:
my_list += my_dict # adding .keys() is useless
, потому что в этом случае добавление на месте выполняет итерации с правой стороны: так что каждая коллекция соответствует.
(или, конечно, принудительная итерация правой руки: + list(my_dict)
)
Так что может принять любой тип, но я подозреваю, что создатели python не сочли его достойным и были удовлетворены простой и быстрой реализацией, которая используется в 99% случаев.