Разница между списком, последовательностью и срезом в Python?

каковы различия между этими встроенными типами данных Python:список, последовательность и slice? Как я вижу, все три по существу представляют то, что C++ и Java называют array.

5 ответов


  • list больше, чем простые массивы. Их можно инициализировать без указания количества элементов. Ты можешь!--1-->/push вы можете remove/pop/del изделия из них, списки различных типов объектов (например, [1,'e', [3]]), вы можете иметь рекурсивные списки... и вы можете нарезать списки, что означает получение нового списка только с несколькими элементами.
  • slice тип объекта, используемый "за кулисами" для обработки расширенной нарезки в a[start:stop:step] форма, как help(slice) показывает.

"последовательность" не является объектом, скорее как неофициальный интерфейс некоторые объекты, такие как list выполнить.


вы смешиваете очень разные вещи в своем вопросе, поэтому я просто отвечу на другой вопрос ; - P

теперь вы спрашиваете об одном из самых важных интерфейсов в Python:iterable - Это в принципе все, что вы можете использовать как for elem in iterable.

iterable имеет трех потомков: sequence, generator и mapping.

  • A последовательность является итерацией со случайным доступом. Вы можете попросить любой элемент последовательности без потреблять предметы перед этим. С помощью этого свойства вы можете построить slices, которые дают вам более одного элемента одновременно. Срез может дать вам подпоследовательность:seq[from:until] и каждый N-й пункт:seq[from:until:nth]. list, tuple и str все последовательности.

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

  • самый простой метод-это генератор. Оно не поддерживает никакой случайный доступ и поэтому никакой отрезать. Вы должны потреблять все предметы в том порядке, в котором они заданы. Generator обычно создает свои элементы только при итерации по ним. Общий способ создания generators выражения генератора. Они выглядят точно так же, как понимание списка, за исключением круглых скобок, например (f(x) for x in y). Вызов функции, использующей yield ключевое слово также возвращает генератор.

общий адаптер для всех iterables-это итератор. iterators имеют тот же интерфейс, что и самый базовый тип, который они поддерживают, a generator. Они создаются явно путем вызова iter на iterable и используются неявно во всех видах конструкций цикла.


список-это последовательность, но последовательность не обязательно список. Последовательность-это любой тип, который поддерживает интерфейс последовательности ("протокол"). Это делается путем ввода утки, а не через строгую иерархию наследования. Обратите внимание, что последовательности являются контейнерами, но контейнеры не обязательно являются последовательностями. (последовательности, ну, последовательны!)

посмотреть http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-buffer-xrange

объекты Slice обычно создаются неявно с помощью синтаксического сахара (foo[2:5]) и предоставляются специальные методы типа контейнера (такие как __getitem__), который можно переопределить. Как правило, вам не придется иметь дело с срезами, если вы не создадите свои собственные последовательности/контейнеры.

посмотреть http://docs.python.org/reference/datamodel.html#specialnames

списки сопоставимы с массивами. Я не уверен, но я думаю, что он реализован в cPython как динамически расширяющийся массив. Однако интерфейс делает его более похожим на вектор STL C++, чем просто старый массив.


  • списки являются типом последовательности, похожим на массив

  • последовательность типы описывают функциональный суперсет:

существует шесть типов последовательностей: строки, строки Юникода, списки, кортежи, буферы и объекты xrange.

  • фрагментов - это нотация для подмассивов (или подстроки, тоже)

подробнее ... http://docs.python.org/glossary.html


строго говоря, срез-это тип, который представляет собой диапазон индексов, например start, stop и step. Срез-это вообще не контейнер. Срез можно использовать для индексирования списка, в результате чего создается новый список, являющийся копией подсписка исходного списка.

списки отличаются от массивов C++ тем, что они гетерогенны; элементы не обязательно должны быть одного типа. И, как уже указывал Майн, "последовательность" - это не тип Python, а скорее описание различных встроенных типов.