Я предполагал, что типы последовательностей в Python являются типами значений. Оказывается, они являются ссылочными типами (что означает, что значение переменной не будет скопировано при назначении новой переменной, но указано). Итак, теперь мне интересно, каковы типы значений в Python? То есть, какие типы в Python можно назначить новым переменным, не беспокоясь о том, что эта переменная была указана?
Что Python рассматривает как ссылочные типы?
Ответ 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 по ссылкам и не понимать, как переназначить имена вызывающих абонентов.