Что Python рассматривает как ссылочные типы? - PullRequest
14 голосов
/ 28 мая 2011

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

Ответы [ 2 ]

20 голосов
/ 28 мая 2011

Все значения в 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
4 голосов
/ 28 мая 2011

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

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

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

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

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

...