2015-05-28 4 views
5

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

Mutable против неизменного: В Python списки полностью изменяемые в то время как кортежи неизменны или постоянно неизменен, так что изменения создают новые кортежи и не делают в месте модификации. Но это всего лишь деталь реализации. В других языках кортежи изменяемы и списки неизменяемы.

Неоднородный гомогенный: Семантически кортежи обычно неоднородны, а списки обычно однородны, но это скорее соглашение, и существует множество исключений. Динамически типизированные языки, такие как Python, имеют гетерогенные списки. Например, Haskell поддерживает полностью статически типизированные гетерогенные списки HList.

Finite vs Infinite: Теоретически список может быть бесконечным, а некоторые языки программирования (Haskell) поддерживают бесконечные списки. Кортеж не может быть бесконечным.

ОБНОВЛЕНИЕ: Единственное теоретическое различие состоит в том, что кортеж должен быть конечным, а список теоретически может быть бесконечным. Остальные различия - это чистые различия в реализации.

Wikipedia говорит: «Кортеж - это конечный упорядоченный список элементов».

Это дает понять, что кортеж - это список, но конечный список.

+0

На каком языке (языках) есть изменчивость другим способом? –

+0

С ++ списки и кортежи оба изменяемы. – StilesCrisis

+0

Возможно, вы захотите переместить этот вопрос на http://cs.stackexchange.com/ – StilesCrisis

ответ

2

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

Вы можете утверждать, что это всего лишь произвольное решение об осуществлении, но это приводит к проблеме изменчивости. Скажем, у меня есть Tuple<double, double> для представления двумерной точки. Если я удалю один из элементов, поэтому у меня есть Tuple<double>, становится ясно, что это уже не двумерная точка, а исходное значение даже остального измерения, скорее всего, больше не актуально и не применимо.

Если, однако, у меня был List<double>, представляющий 2 студенческих оценки, и удалил один из них, теперь у меня есть список из 1 оценки ученика. Но оставшаяся двойная ставка по-прежнему остается результатом и все еще сохраняет полный смысл/актуальность оценки.

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

+0

C++ очень похож в этом отношении. Вы можете связать кортежи с 'tuple_cat', но это действительно просто создание нового кортежа с новым типом. – StilesCrisis

+0

Первое отличие - простая неизменность. В C#, например Python или Scala, кортежи по умолчанию неизменяемы. Вы можете добавлять/удалять элементы, но это создает новый кортеж и сохраняет исходный текст без изменений. Второе различие является чисто смысловым. Если у вас есть список тестов, семантически большинство будет использовать список, но вы можете использовать кортеж – clay

1

Математически кортеж может быть списком элементов и, следовательно, также списком, но я не знаю о специфике кортежей и списка в этом домене. С точки зрения программирования я вижу семантическую разницу, которая заключается в том, что список является контейнером для элементов, а кортеж - объектом, представляющим многомерные данные (например, 2D или 3D). Поэтому вы не будете использовать кортеж, чтобы сохранить список элементов. Вместо этого вы используете кортеж для представления многомерных данных.

+0

2D/3D-точка - это список координат. Кортеж - это всегда список элементов. – clay

 Смежные вопросы

  • Нет связанных вопросов^_^