Неизменяемость - это концепция на уровне языка. Язык определяет, что реализация не дает вам инструмента для изменения строкового объекта после его создания.
Сама реализация может иметь внутренних инструментов для изменения строки при ее создании, прежде чем он станет доступным для вас.
Например, в реализации строки CPython конкатенация строк выполняется путем создания пустого объекта PyUnicode
с новым размером , который представляет строку внутри. Затем символы из двух исходных строк копируются, прежде чем объект будет возвращен:
PyObject *
PyUnicode_Concat(PyObject *left, PyObject *right)
{
PyObject *result;
/* […] */
Py_ssize_t left_len, right_len, new_len;
/* […] */
left_len = PyUnicode_GET_LENGTH(left);
right_len = PyUnicode_GET_LENGTH(right);
/* […] */
result = PyUnicode_New(new_len, maxchar);
/* […] */
_PyUnicode_FastCopyCharacters(result, 0, left, 0, left_len);
_PyUnicode_FastCopyCharacters(result, left_len, right, 0, right_len);
/* […] */
return result;
}
Если я хочу вбить гвоздь в кусок дерева, но это дерево не изменится, как я получу в результате кованый кусок дерева?
В этой аналогии это означает, что вам дают кусок дерева с гвоздем в нем, но вам не дают молотка. Языковая реализация поставила вам гвоздь в дерево, но вы не можете ничего сказать о том, как она это сделала. Возможно, он использовал молоток или дерево вокруг ногтя.