В чем разница между списками и кортежами?
Какая разница?
Каковы преимущества / недостатки кортежей / списков?
24 ответа
Помимо того, что кортежи являются неизменяемыми, существует также семантическое различие, которое должно определять их использование. Кортежи - это гетерогенные структуры данных (т. Е. Их записи имеют разное значение), а списки - это однородные последовательности. Кортежи имеют структуру, списки имеют порядок.
Использование этого различия делает код более явным и понятным.
Одним примером могут быть пары страниц и номер строки для ссылки на места в книге, например:
my_location = (42, 11) # page number, line number
Затем вы можете использовать это в качестве ключа в словаре для хранения заметок о местах. Список с другой стороны может быть использован для хранения нескольких мест. Естественно, можно добавить или удалить местоположения из списка, поэтому имеет смысл, что списки изменчивы. С другой стороны, нет смысла добавлять или удалять элементы из существующего местоположения - следовательно, кортежи неизменны.
Могут быть ситуации, когда вы хотите изменить элементы в существующем кортеже местоположения, например, при переборе по строкам страницы. Но неизменность кортежей заставляет вас создавать новый кортеж местоположения для каждого нового значения. На первый взгляд это кажется неудобным, но использование таких неизменяемых данных является краеугольным камнем типов значений и методов функционального программирования, которые могут иметь существенные преимущества.
Есть несколько интересных статей по этому вопросу, например, "Кортежи Python - это не просто списки констант" или "Понимание кортежей и списков в Python". Официальная документация Python также упоминает это
"Кортежи неизменны и обычно содержат гетерогенную последовательность...".
В статически типизированном языке, таком как Haskell, значения в кортеже обычно имеют разные типы, и длина кортежа должна быть фиксированной. В списке все значения имеют одинаковый тип, а длина не фиксирована. Так что разница очень очевидна.
Наконец, в Python есть именованный кортеж, который имеет смысл, потому что кортеж уже должен иметь структуру. Это подчеркивает идею о том, что кортежи являются легкой альтернативой классам и экземплярам.
Разница между списком и кортежем
буквальный
someTuple = (1,2) someList = [1,2]
Размер
a = tuple(range(1000)) b = list(range(1000)) a.__sizeof__() # 8024 b.__sizeof__() # 9088
Из-за меньшего размера операции кортежа она становится немного быстрее, но не так много, чтобы упоминать, пока у вас не будет огромное количество элементов.
Разрешенные операции
b = [1,2] b[0] = 3 # [3, 2] a = (1,2) a[0] = 3 # Error
Это также означает, что вы не можете удалить элемент или отсортировать кортеж. Однако вы можете добавить новый элемент в список и кортеж с той лишь разницей, что вы измените идентификатор кортежа, добавив элемент
a = (1,2) b = [1,2] id(a) # 140230916716520 id(b) # 748527696 a += (3,) # (1, 2, 3) b += [3] # [1, 2, 3] id(a) # 140230916878160 id(b) # 748527696
использование
Поскольку список является изменяемым, его нельзя использовать в качестве ключа в словаре, тогда как кортеж можно использовать.
a = (1,2) b = [1,2] c = {a: 1} # OK c = {b: 1} # Error
Если вы пошли гулять, вы можете записать свои координаты в любой момент в течение (x,y)
кортеж.
Если вы хотите записать свое путешествие, вы можете добавлять свое местоположение каждые несколько секунд в список.
Но вы не могли сделать это наоборот.
Ключевое отличие состоит в том, что кортежи неизменны. Это означает, что вы не можете изменить значения в кортеже после его создания.
Поэтому, если вам нужно изменить значения, используйте список.
Преимущества для кортежей:
- Незначительное улучшение производительности.
- Поскольку кортеж является неизменным, его можно использовать в качестве ключа в словаре.
- Если вы не можете изменить его, никто другой не может, то есть вам не нужно беспокоиться о каких-либо функциях API и т. Д., Об изменении вашего кортежа без запроса.
Списки изменчивы; кортежей нет.
От http://docs.python.org/2/tutorial/datastructures.html
Кортежи являются неизменяемыми и обычно содержат гетерогенную последовательность элементов, доступ к которым осуществляется посредством распаковки (см. Далее в этом разделе) или индексации (или даже по атрибуту в случае именованных кортежей). Списки изменчивы, и их элементы обычно однородны и доступны путем итерации по списку.
Это пример списков Python:
my_list = [0,1,2,3,4]
top_rock_list = ["Bohemian Rhapsody","Kashmir","Sweet Emotion", "Fortunate Son"]
Это пример кортежа Python:
my_tuple = (a,b,c,d,e)
celebrity_tuple = ("John", "Wayne", 90210, "Actor", "Male", "Dead")
Списки и кортежи Python похожи в том, что они оба являются упорядоченными коллекциями значений. Помимо небольшой разницы в том, что списки создаются с использованием скобок "[ ..., ... ]" и кортежей с использованием скобок "( ..., ...)", основное техническое отличие "жестко запрограммировано в синтаксисе Python" между ними заключается в том, что элементы определенного кортежа являются неизменяемыми, тогда как списки являются изменяемыми (... поэтому только кортежи могут быть хэшируемыми и могут использоваться в качестве словарных / хэш-ключей!). Это приводит к различиям в том, как они могут или не могут быть использованы (применены априори с помощью синтаксиса), и к различиям в том, как люди выбирают их использование (поощряется как "передовой опыт", апостериорно, это то, что делают умные программисты). Основное отличие апостериорной дифференциации использования кортежей от использования списков заключается в том, какое значение люди придают порядку элементов.
Для кортежей "порядок" означает не что иное, как определенную "структуру" для хранения информации. Какие значения находятся в первом поле, можно легко переключить во второе поле, поскольку каждое из них предоставляет значения в двух разных измерениях или масштабах. Они дают ответы на различные типы вопросов и обычно имеют форму: для какого объекта / предмета каковы его атрибуты? Объект / предмет остается неизменным, атрибуты различаются.
Для списков "порядок" означает последовательность или направленность. Второй элемент ДОЛЖЕН идти после первого элемента, потому что он расположен на 2-м месте в зависимости от определенной общей шкалы или измерения. Элементы взяты целиком и в основном дают ответы на один вопрос, как правило, в форме, для данного атрибута, как эти объекты / субъекты сравниваются? Атрибут остается постоянным, объект / тема отличается.
Есть бесчисленные примеры людей в популярной культуре и программистов, которые не соответствуют этим различиям, и есть бесчисленные люди, которые могли бы использовать вилку для салата в качестве основного блюда. В конце концов, все в порядке, и оба обычно могут выполнить свою работу.
Подводя итог некоторых мелких деталей
сходства:
- Дубликаты - и кортежи, и списки допускают дубликаты
Индексирование, выбор и нарезка - и кортежи, и списки индексируют, используя целочисленные значения в скобках. Итак, если вы хотите первые 3 значения данного списка или кортежа, синтаксис будет таким же:
>>> my_list[0:3] [0,1,2] >>> my_tuple[0:3] [a,b,c]
Сравнение и сортировка - два кортежа или два списка сравниваются по их первому элементу, а если есть связь, то по второму элементу и так далее. Дальнейшее внимание не уделяется последующим элементам после того, как более ранние элементы показывают разницу.
>>> [0,2,0,0,0,0]>[0,0,0,0,0,500] True >>> (0,2,0,0,0,0)>(0,0,0,0,0,500) True
Отличия: - априори по определению
Синтаксис - Списки используют [], кортежи используют ()
Изменчивость - элементы в данном списке являются изменяемыми, элементы в данном кортеже НЕ являются изменяемыми.
# Lists are mutable: >>> top_rock_list ['Bohemian Rhapsody', 'Kashmir', 'Sweet Emotion', 'Fortunate Son'] >>> top_rock_list[1] 'Kashmir' >>> top_rock_list[1] = "Stairway to Heaven" >>> top_rock_list ['Bohemian Rhapsody', 'Stairway to Heaven', 'Sweet Emotion', 'Fortunate Son'] # Tuples are NOT mutable: >>> celebrity_tuple ('John', 'Wayne', 90210, 'Actor', 'Male', 'Dead') >>> celebrity_tuple[5] 'Dead' >>> celebrity_tuple[5]="Alive" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
Хеш-таблицы (словари) - поскольку хеш-таблицы (словари) требуют, чтобы его ключи были хешируемыми и, следовательно, неизменяемыми, только кортежи могут выступать в качестве ключей словаря, а не списков.
#Lists CAN'T act as keys for hashtables(dictionaries) >>> my_dict = {[a,b,c]:"some value"} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' #Tuples CAN act as keys for hashtables(dictionaries) >>> my_dict = {("John","Wayne"): 90210} >>> my_dict {('John', 'Wayne'): 90210}
Отличия - апостериорные, в использовании
Гомо против гетерогенности элементов - Как правило, объекты списка являются однородными, а объекты кортежей неоднородными. То есть списки используются для объектов / субъектов одного и того же типа (как и все кандидаты в президенты, или все песни, или все бегуны), хотя, хотя это и не навязывается), тогда как кортежи больше подходят для разнородных объектов.
Циклы и структуры - хотя оба допускают цикл (для x в my_list...), имеет смысл делать это только для списка. Кортежи больше подходят для структурирования и представления информации (%s %s, находящийся в% s, является% s и в настоящее время%s % ("Джон","Уэйн",90210, "Актер","Мертвый"))
Было упомянуто, что разница в значительной степени семантическая: люди ожидают, что кортеж и список будут представлять различную информацию. Но это идет дальше, чем руководство; некоторые библиотеки на самом деле ведут себя по-разному в зависимости от того, что они передаются. Взять, к примеру, NumPy (скопировано из другого поста, где я прошу больше примеров):
>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
[3, 4, 5]])
Дело в том, что, хотя NumPy может и не входить в стандартную библиотеку, это основная библиотека Python, а в списках и кортежах NumPy совершенно разные вещи.
Списки для циклов, кортежи для структур, т.е. "%s %s" %tuple
,
Списки обычно однородны, кортежи обычно неоднородны.
Списки для переменной длины, кортежи для фиксированной длины.
Значения списка могут быть изменены в любое время, но значения кортежей не могут быть изменены.
Преимущества и недостатки зависят от использования. Если у вас есть такие данные, которые вы никогда не захотите изменить, вам следует использовать кортеж, в противном случае список - лучший вариант.
Разница между списком и кортежем
Кортежи и списки в Python выглядят как схожие типы последовательностей.
Буквальный синтаксис
Мы используем круглые скобки (
) построить кортежи и квадратные скобки
[ ]
чтобы получить новый список. Также мы можем использовать вызов соответствующего типа, чтобы получить требуемую структуру - кортеж или список.someTuple = (4,6) someList = [2,6]
переменчивость
Кортежи неизменны, а списки изменчивы. Этот пункт является основой для следующих.
Использование памяти
Из-за изменчивости вам нужно больше памяти для списков и меньше памяти для кортежей.
простирающийся
Вы можете добавить новый элемент в кортежи и списки с той лишь разницей, что идентификатор кортежа будет изменен (т. Е. У нас будет новый объект).
хеширования
Кортежи могут быть хэшируемыми, а списки - нет. Это означает, что вы можете использовать кортеж в качестве ключа в словаре. Список нельзя использовать в качестве ключа в словаре, тогда как кортеж можно использовать
tup = (1,2) list_ = [1,2] c = {tup : 1} # ok c = {list_ : 1} # error
Семантика
Этот момент больше о лучшей практике. Вы должны использовать кортежи как гетерогенные структуры данных, в то время как списки являются однородными последовательностями.
Предполагается, что списки являются однородными последовательностями, а кортежи - гетерогенными структурами данных.
Поскольку люди уже упоминали о различиях, я напишу о том, почему кортежи.
Почему кортежи предпочтительнее?
Оптимизация распределения для небольших кортежей
Чтобы уменьшить фрагментацию памяти и ускорить выделение памяти, Python повторно использует старые кортежи. Если кортеж больше не нужен и в нем меньше 20 элементов, вместо того, чтобы удалить его навсегда, Python перемещает его в свободный список.
Свободный список разделен на 20 групп, каждая из которых представляет собой список кортежей длиной n от 0 до 20. Каждая группа может хранить до 2 000 кортежей. Первая (нулевая) группа содержит только 1 элемент и представляет собой пустой кортеж.
>>> a = (1,2,3)
>>> id(a)
4427578104
>>> del a
>>> b = (1,2,4)
>>> id(b)
4427578104
В приведенном выше примере мы видим, что a и b имеют одинаковый идентификатор. Это потому, что мы немедленно заняли уничтоженный кортеж, который был в свободном списке.
Оптимизация размещения списков
Поскольку списки можно изменять, Python не использует такую же оптимизацию, как в кортежах. Однако списки Python также имеют свободный список, но он используется только для пустых объектов. Если пустой список удаляется или собирается сборщиком мусора, его можно повторно использовать позже.
>>> a = []
>>> id(a)
4465566792
>>> del a
>>> b = []
>>> id(b)
4465566792
Источник: https://rushter.com/blog/python-lists-and-tuples/
Почему кортежи эффективнее списков?-> /questions/29635975/yavlyayutsya-li-kortezhi-bolee-effektivnyimi-chem-spiski-v-python/29635983#29635983
PEP 484 - Type Hints говорит, что типы элементов tuple
можно набирать индивидуально; так что вы можете сказать Tuple[str, int, float]
; но list
, с List
класс typeing может принимать только один параметр типа: List[str]
, что намекает на то, что различие между 2 в действительности состоит в том, что первое является неоднородным, а второе по сути однородным.
Кроме того, стандартная библиотека в основном использует кортеж в качестве возвращаемого значения от таких стандартных функций, где C будет возвращать struct
,
Как люди уже ответили здесь, что tuples
неизменны в то время как lists
изменчивы, но есть один важный аспект использования кортежей, который мы должны помнить
Если tuple
содержит list
или dictionary
внутри него они могут быть изменены, даже если tuple
Сам по себе неизменен.
Например, давайте предположим, что у нас есть кортеж, который содержит список и словарь в виде
my_tuple = (10,20,30,[40,50],{ 'a' : 10})
мы можем изменить содержимое списка как
my_tuple[3][0] = 400
my_tuple[3][1] = 500
что делает новый кортеж выглядит
(10, 20, 30, [400, 500], {'a': 10})
мы также можем изменить словарь внутри кортежа как
my_tuple[4]['a'] = 500
что сделает общий кортеж выглядит
(10, 20, 30, [400, 500], {'a': 500})
Это происходит потому, что list
а также dictionary
являются объектами, и эти объекты не меняются, но содержимое, на которое он указывает.
Итак tuple
остается неизменным без каких-либо исключений
Самое главное отличие - время! Если вы не хотите изменять данные внутри списка, лучше использовать кортеж! Вот пример использования кортежа!
import timeit
print(timeit.timeit(stmt='[1,2,3,4,5,6,7,8,9,10]', number=1000000)) #created list
print(timeit.timeit(stmt='(1,2,3,4,5,6,7,8,9,10)', number=1000000)) # created tuple
В этом примере мы выполнили оба оператора 1 миллион раз.
Выход:
0.136621
0.013722200000000018
Каждый может четко заметить разницу во времени.
Указание направления из документации по 5.3. Кортежи и последовательности:
Хотя кортежи могут показаться похожими на списки, они часто используются в разных ситуациях и для разных целей. Кортежи являются неизменяемыми и обычно содержат гетерогенную последовательность элементов, доступ к которым осуществляется посредством распаковки (см. Далее в этом разделе) или индексации (или даже по атрибуту в случае именованных кортежей). Списки изменчивы, и их элементы обычно однородны и доступны путем итерации по списку.
Другими словами, TUPLES используются для хранения группы элементов, где содержимое/члены группы не будут меняться, в то время как LISTS используются для хранения группы элементов, где члены группы могут изменяться.
Например, если я хочу сохранить IP-адрес своей сети в переменной, лучше всего использовать кортеж, поскольку IP-адрес фиксирован. Как это
my_ip = ('192.168.0.15', 33, 60)
. Однако, если я хочу сохранить группу IP-адресов мест, которые я посещу в течение следующих 6 месяцев, мне следует использовать СПИСОК, так как я буду постоянно обновлять и добавлять новые IP-адреса в группу. Как это
places_to_visit = [
('192.168.0.15', 33, 60),
('192.168.0.22', 34, 60),
('192.168.0.1', 34, 60),
('192.168.0.2', 34, 60),
('192.168.0.8', 34, 60),
('192.168.0.11', 34, 60)
]
Просто быстрое расширение list
против tuple
ответы:
Благодаря динамичному характеру,
list
выделяет больше битовых сегментов, чем требуется фактической памяти. Это сделано для предотвращения дорогостоящей операции перераспределения в случае добавления дополнительных элементов в будущем.С другой стороны, будучи статичным, легким
tuple
объект не резервирует дополнительную память, необходимую для их хранения.
Прежде всего, они оба являются нескалярными объектами (также известными как составные объекты) в Python.
- Кортежи, упорядоченная последовательность элементов (которая может содержать любой объект без проблем с псевдонимами)
- Неизменный (кортеж, int, float, str)
- Конкатенация с использованием
+
(Совершенно новый кортеж будет создан, конечно) - индексирование
- нарезка
- одиночка
(3,) # -> (3)
вместо(3) # -> 3
- Список (массив на других языках), упорядоченная последовательность значений
- изменчивый
- одиночка
[3]
- клонирование
new_array = origin_array[:]
- Понимание списка
[x**2 for x in range(1,7)]
дает тебе[1,4,9,16,25,36]
(Не читается)
Использование списка также может вызвать ошибку псевдонимов (два разных пути, указывающие на один и тот же объект).
Списки изменяемы. тогда как кортежи неизменны. Доступ к смещенному элементу с индексом имеет больше смысла в кортежах, чем в списках, потому что элементы и их индекс не могут быть изменены.
Списки изменчивы, а кортежи неизменны. Просто рассмотрите этот пример.
a = ["1", "2", "ra", "sa"] #list
b = ("1", "2", "ra", "sa") #tuple
Теперь измените значения индекса списка и кортежа.
a[2] = 1000
print a #output : ['1', '2', 1000, 'sa']
b[2] = 1000
print b #output : TypeError: 'tuple' object does not support item assignment.
Следовательно, доказано, что следующий код недопустим с кортежем, потому что мы попытались обновить кортеж, что недопустимо.
Основное отличие, которое я обнаружил, состоит в том, что списки изменчивы, а кортежи неизменны. Кортежи хороши для вычислений, в которых их не нужно менять.
Список изменчив, а кортежи неизменны. Основное различие между изменяемым и неизменным заключается в использовании памяти при попытке добавить элемент.
При создании переменной некоторая фиксированная память назначается переменной. Если это список, то выделяется больше памяти, чем фактически используется. Например, если текущее назначение памяти составляет 100 байт, когда вы хотите добавить 101-й байт, возможно, будет назначено еще 100 байт (всего 200 байт в этом случае).
Однако, если вы знаете, что вы не часто добавляете новые элементы, вам следует использовать кортежи. Кортежи назначают точно необходимый объем памяти и, следовательно, экономят память, особенно когда вы используете большие блоки памяти.
Наряду с множеством других комментариев, сделанных здесь, преимущество, которое я вижу в использовании кортежей, заключается в гибкости их возможности иметь значения разных типов, НЕ КАК список.
Возьмем, к примеру, таблицу базы данных с разными значениями и типами, назначенными для каждого столбца. Список вообще не может воспроизвести это (из-за его ограничения единственным типом значения, которое он может содержать), тогда как Tuple может иметь несколько разных типов и значений с их размещением, уважаемым для каждого столбца (и может даже быть помещен в список создание собственного виртуального представления базы данных).
Эта гибкость и ограничение (поскольку значения не могут быть изменены) также имеют свои преимущества, например, для передачи данных транзакции (или, скажем, чего-то похожего на формат таблицы). Вы «запечатываете» данные в кортеже, предотвращая их изменение, перед отправкой, защищая их из-за того, для чего они предназначены: обеспечения неизменности. В чем разница по сравнению с коллекцией только для чтения? Дело в том, что у вас могут быть разные типы значений.
Его применение (из-за большого использования списков, объектов и словарей в целом) ограничено, поскольку люди обычно придерживаются мнения, что объектная модель будет лучшим вариантом (и в некоторых случаях так и есть), но говорят, что вы не делаете этого. Мне не нужна объектная модель, потому что вы предпочитаете хранить ее отдельно от того, что вы определили как свои бизнес-объекты. Тогда кортеж может сослужить вам хорошую службу в том, чего вы пытаетесь достичь.