2012-04-02 3 views
7

Я некоторое время знал, что основное различие между списками и кортежами в Python состоит в том, что списки изменяемы, а кортежи - нет. Помимо этого и различных доступных им методов, я очень мало знаю о списках и кортежах. Есть ли другая разница между ними? Есть ли любые преимущества/недостатки (помимо неизменности) в использовании кортежа над списком в Python 3? Имеет ли более быстрое время доступа или имеет меньший размер памяти или содержит больше методов, чем другой? Являются ли их внутренние структуры разными? Или кортеж просто неизменный список, не более?Разница между списком и кортежем (минус неизменяемость) в Python?

+0

Возможный дубликат [В чем разница между списком и кортежами?] (Http://stackoverflow.com/questions/626759/whats-the-difference-between-list-and-tuples) –

ответ

7

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

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

Для этого скорость или нет, вы можете измерить конкретную ситуацию с помощью модуля timeit.

Вы должны знать, что кортежи неизменяемы только по отношению к числу и значениям хранимых ссылок. Если (скажем) список используется как один из элементов кортежа, содержимое списка может быть изменено. Таким образом, логически, содержимое кортежа не является постоянным (такой набор не хешируется).

Использовать любой тип лучше для этой цели. Нет строгого предпочтения. Это зависит от ситуации.

4

Выполнить каталог на обоих из них - довольно другой список методов (поп показано ниже). кортежи могут быть быстрее

>>> alist = [1,2,3] 
>>> atuple = (1,2,3) 
>>> alist.pop() 
3 
>>> atuple.pop() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'tuple' object has no attribute 'pop' 

«Append», «счетчик», «простираться», «индекс», «вставить», «поп», «удалить», «обратный», «вроде» все доступны для списки, а не кортежи - что имеет смысл, учитывая идею непреложности.

Философски, некоторые люди ожидают, что списки будут однородными и не будут иметь ожиданий кортежей.

+0

Существуют ли какие-либо внутренние различия в типы, такие как структура или кодирование? – fouric

+0

Если вы имеете в виду строковое кодирование, то это не имеет отношения к кортежам. Кодировка - это всего лишь способ преобразования абстрактной строки в конкретную последовательность байтов. Когда кортеж содержит строковый элемент, строковый объект создается вне кортежа. Элемент кортежа относится только к объекту (нетипизированная ссылка). То же самое происходит как с элементом набора, так и с элементом списка. – pepr

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