При работе с неизменяемыми объектами в Python как создается новый объект? - PullRequest
2 голосов
/ 12 апреля 2020

Я понимаю, что неизменяемые объекты нельзя изменить на месте. Новый объект создается и переназначается на то же имя переменной. Таким образом, мы можем поддерживать связь с переменной. Внутри переменная указывает на другой объект.

>>> string = 'object'
>>> old_id = id(string)
>>> old_id
4452633584
>>> string = 'new' + string
>>> new_id = id(string)
>>> new_id
4501338544
>>> old_id == new_id
False

В приведенном выше примере Python создает изменяемый клон string для объединения в 'new', а затем делает этот новый объект неизменным перед переназначением string?

Я не понимаю, как объекты, которые не могут быть изменены на месте , также могут работать.

Разве Python не нужна изменяемая вещь для изменения, чтобы произвести новую вещь? Если я хочу вбить гвоздь в кусок дерева, но это дерево не изменится, как я получу в результате забитый кусок дерева?

1 Ответ

3 голосов
/ 12 апреля 2020

Неизменяемость - это концепция на уровне языка. Язык определяет, что реализация не дает вам инструмента для изменения строкового объекта после его создания.

Сама реализация может иметь внутренних инструментов для изменения строки при ее создании, прежде чем он станет доступным для вас.

Например, в реализации строки 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;
}

Если я хочу вбить гвоздь в кусок дерева, но это дерево не изменится, как я получу в результате кованый кусок дерева?

В этой аналогии это означает, что вам дают кусок дерева с гвоздем в нем, но вам не дают молотка. Языковая реализация поставила вам гвоздь в дерево, но вы не можете ничего сказать о том, как она это сделала. Возможно, он использовал молоток или дерево вокруг ногтя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...