Неизменность в Python

Я пытаюсь понять, как неизменяемость работает на python. Поскольку строка является неизменной в python, я ожидал, что идентификатор будет меняться каждый раз, когда я выполняю операцию с строкой, но она не работает должным образом. Пример: Последняя операция по t не изменяет свой идентификатор. Любые идеи почему?

Снимок экрана операции

2 Solutions collect form web for “Неизменность в Python”

У меня был ряд яблок в разных ячейках [memory containing variables (I will not go to the bit level)] , из которых некоторые были пустыми [cells containing garbage / empty value] .

Я взял его. Это было в ячейке 3 [logical address = 3] .

Я нарисовал его синим (после того, как я клонировал его с использованием технологии будущего, для демонстрации непреложности) [committed an operation on it, same could go for addition for integers] .

Я посмотрел, куда его поместить, и хотя ячейка 4 была бесплатной, ячейка 3 была также (потому что «оригинальное» яблоко больше здесь)! Поэтому я вернул его в ячейку 3 [and although we get a "new" apple, it has the same address] .


То же самое касается вашего t (обратите внимание, что id – это адрес памяти переменной в CPython), но поскольку мы говорим о «цепях яблок» здесь (строки сделаны из последовательности символов, мы должны рассмотреть объем пространства, который мы необходимо продолжить последовательность, поэтому, если бы у меня была похожая память ( _ означает произвольные данные мусора, «^» для пробела)

 H ello _ _ _ _ _ BOOM ^ string pointer points here 

и я хотел изменить строку на "Hello you" , я мог бы рассмотреть возможность использования свободного места:

 H ello ^ you _ BOOM ^ string pointer points here 

Но если я хочу изменить строку на "Hello world!" , Мне пришлось бы искать свободное пространство в длину "Hello world!" где-то еще (мы можем иметь это сразу после "BOOM" , что вероятно в среде сбора мусора, посмотрите, как отличаются ваши идентификаторы):

 H ello ^ you _ BOOM _ H ello ^ world ! _ GARBAGE ^ string pointer points here 

Идентификаторы объектов могут быть повторно использованы, если исходный объект больше не присутствует. Это не относится к строкам, а относится ко всем типам Python. Для простейшего примера вы можете проверить идентификатор простого object :

 >>> print id(object()) 140437485756544 >>> print id(object()) 140437485756544 

Однако, если мы сохраним ссылку на предыдущий объект, идентификатор не будет использоваться повторно:

 >>> a = object() >>> id(a) 140437485756544 >>> b = object() >>> id(b) 140437485756560 

Вы можете воспроизвести одно и то же поведение в тестах со строками, добавив промежуточные результаты (значения в t ) в список.

  • Изменение __name__ генератора
  • «AttributeError» при попытке создать экран консоли с помощью urwid
  • Эффективный способ подсчета True и False
  • Сортировка списка словарей несколькими клавишами с различным порядком
  • Python Удаление нелатинских символов
  • Почему мой класс стоит столько памяти?
  • Булева проверка не работает в функции
  • Как получить все смежные подстроки строки в Python?
  • Печать структуры данных дерева в Python
  • Сравнение / объединение двух словарей
  • изменение глобальной переменной при многопроцессорности в python
  • Python - лучший язык программирования в мире.