Подтвердить что ты не робот

Что Python рассматривает как ссылочные типы?

Я предполагал, что типы последовательностей в Python являются типами значений. Оказывается, они являются ссылочными типами (что означает, что значение переменной не будет скопировано при назначении новой переменной, но указано). Итак, теперь мне интересно, каковы типы значений в Python? То есть, какие типы в Python можно назначить новым переменным, не беспокоясь о том, что эта переменная была указана?

4b9b3361

Ответ 1

Все значения в Python являются ссылками. Что вам нужно беспокоиться, если тип изменен. Основные числовые и строковые типы, а также tuple и frozenset неизменяемы; имена, привязанные к объекту одного из этих типов, могут быть отскакиваны, а не мутированы.

>>> t = 1, 2, 3
>>> t[1] = 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

Ответ 2

Ответ выше правильный, но я возражаю против семантики "ссылки".

C-подобные языки рассматривают переменные как фиксированные ведра, в которые помещаются значения. Когда вы вызываете функцию, создается новый набор ведер, и значения копируются в них. Иногда ведро является передачей по ссылке и фактически становится псевдонимом для ведра вызывающего.

Python, с другой стороны, рассматривает переменные как простые метки (имена) для значений (объектов). Когда вы вызываете функцию, создается новый набор меток и наклеивается на те же объекты.

Не имеет смысла упоминать "ссылки" в контексте Python, потому что на любом другом языке "ссылка" подразумевает альтернативу "ценности". У Питона нет такой двойственности; он просто проходит и назначает объекты. Ничто не упоминается.

Nitpicky, возможно, но терминология не вызывает недоумения для программистов на C++, которые, например, слышать пропуски Python по ссылкам и не понимать, как переназначить имена вызывающих абонентов.