Списки (List) vs Кортежи (Typle)

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

Различия в представлении

Представление списков и кортежей отличается незначительно. Списки обычно заключаются в квадратную скобку ё[], а элементы - через запятую. Кортежи заключаются в круглую скобку (), а элементы разделяются запятой. Скобки использовать необязательно, и такие типы кортежей называются упаковкой кортежей.

Рассмотрим следующий пример.

list1 = ['JavaTpoint', 1, 2, 54.30, {'Name: ''Peter'}]  
print(type(list))  
tuple1 = ('JavaTpoint',5,8,31.9,[1,2,3])  
print(type(tuple1))  

Вывод:

<class 'list'>
<class 'tuple'>

В приведенной выше программе мы определили переменную list1, которая содержит список данных разного типа с индексом от 0 до 4. Мы определили еще одну переменную tuple1, которая содержит кортеж данных разного типа. Она заключена в рамку ().

Изменяемые списки и неизменяемые кортежи в Python

Это самое важное различие между списком и кортежем, в то время как списки являются изменяемыми, а кортежи - неизменяемыми. Списки являются изменяемыми, что означает, что объект Python может быть изменен после создания, в то время как кортежи не могут быть изменены после создания. Рассмотрим приведенный пример.

a = ["Peter","Joseph","Mathew","Ricky"]  
print(a)  

Вывод:

['Peter', 'Joseph', 'Mathew', 'Ricky']

Теперь мы меняем 0-й элемент индекса "Peter" на "Samson".

a[0] = "Samson"  
print(a)  

Вывод:

['Samson', 'Joseph', 'Mathew', 'Ricky']

Теперь мы создаем кортеж и делаем то же самое.

a = (10,20,"JavaTpoint",30,40)  
print(a)  

Вывод:

(10, 20, 'JavaTpoint', 30, 40)
a[0] = 50  

Вывод:

TypeError                                 Traceback (most recent call last)
<ipython-input-5-52b2981fae12> in <module>
----> 1 a[0] = 50

TypeError: 'tuple' object does not support item assignment

Мы получаем ошибку при изменении 1-го элемента кортежа из-за неизменяемости. Он не поддерживает присвоение элементов.

Отладка кортежей и списков в Python

Кортежи легко отлаживать в большом проекте из-за их неизменяемости. Если у нас небольшой проект или меньшее количество данных, то списки играют эффективную роль. Рассмотрим следующий пример:

a = [6,9,4,3,7,0,1]  
# Copying address of a in b  
b = a  
a[3] = "JavaToint"  
print(a)  

Вывод:

[6, 9, 4, 'JavaToint', 7, 0, 1]

В приведенном выше коде мы сделали b = a; здесь мы не копируем объект списка из b в a. b ссылается на адрес списка a. Это означает, что если мы сделаем изменение в b, то это отразится так же, как и в списке a, и это облегчает отладку. Но это сложно для серьезного проекта, где объекты Python могут иметь множество ссылок.

Будет сложно отслеживать эти изменения в списках, но неизменяемый объект кортежа не может измениться после создания. Поэтому кортежи легче отлаживать.

Поддержка функций у кортежей и списков в Python

Кортежи поддерживают меньше операций, чем списки. Встроенный dir(object) используется для получения всех поддерживаемых функций для списка и кортежа.

Функциии списков (List)

dir(list)  

Вывод:

['__add__','__class__','__contains__','__delattr__','__delitem__','__dir_,
 '__doc__','__eq__','__format__', '__get__','__getattribute__','__getitem_' '__gt__','__hash__','__iadd__','__imul__','__init__','__init_subclass__''__iter__','__le__','__len__','__lt__','__mul__', '__ne__','__new__',
 '__reduce__', '__reduce_ex__','__repr__','__reversed__','__rmul__','__setattr__','__setitem__','__sizeof__','__str__','__subclasshook__',
 'append',
 'clear',
 'copy',
 'count',
 'extend',
 'index',
 'insert',
 'pop',
 'remove',
 'reverse',
 'sort']

Функциии кортежей (Tuple)

Вывод:

['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__getnewargs__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__rmul__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'count',
 'index']

Расходование памяти у списков (List) и у кортежей (Tuple) в Python

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

Tuple = (1,2,3,4,5,6,7,8,9,0,5485,87525,955,3343,53234,6423,623456,234535)  
List = [1,2,3,4,5,6,7,8,9,0,78,34,43,32,43,55,54,212,642,533,43434,54532 ]  
print('Tuple size =', Tuple.__sizeof__())       # Tuple size = 52  
print('List size =', List.__sizeof__())    

Вывод:

Tuple size = 168
List size = 216

Заключение

В некоторых случаях списки могут показаться более полезными, чем кортежи. Но кортежи являются важными структурами данных в Python. Кортежи обычно используются для неизменяемых данных, или можно сказать, что данные в кортежах "защищены от записи". Кортежи передают интерпретатору Python указание на то, что данные не должны меняться в будущем. Мы можем использовать кортеж так же, как и словарь, не используя ключи для хранения данных, например:

list1 = [(101, "Mike", 24),(102, 'Hussey', 26),(103, 'David', 27),(104,  'Warner', 29)]  

Кортежи могут использовать ключи словаря, поскольку они хэшируемы и неизменяемы, в то время как списки не могут использовать ключи словаря.

dict = {("Mike",22):24000}    #valid dictionary  
dict = {["Peter",26]:25000}   #Invalid dictionary  

кортежи (tuple)

множества (set)