Яка різниця між списками та кортежами?


1020

Яка різниця?

Які переваги / недоліки кортежів / списків?


13
Інші відповіли нижче, але я хотів би зазначити, що, imho, python має абсолютно неінтуїтивні назви типів даних. Я не думаю, що в будь-якій іншій мові є кортежі (за цією назвою), і що гірше, ніж слово, я навіть не можу перекласти його мовою. Хтось знає, звідки береться "кортеж"? Голландська?
Грак

98
Кортежі - основний термін у математиці, що походить від латинської мови (див. Wikipedia).
nikow

129
пара -> потрійний -> чотириразовий -> четвірка -> секступл -> гм, як це називається, ай дер його, 7-кортеж -> 8-кортеж -> ... отже «кортеж» як загальна назва.
Джон Фухі

31
@JohnFouhy Це вже через шість років, але: ... heptuple, octuple, tuple-with-nine-elements, decuple, undecuple, dodecuple ...: D
Augusta

18
@MegaWidget Я думав, що ми встановили, що nontuple - це list. ; D
Августа

Відповіді:


1017

Окрім того, що кортежі незмінні, існує також семантичне розрізнення, яке має керувати їх використанням. Кортежі - це неоднорідні структури даних (тобто їх записи мають різний зміст), а списки - однорідні послідовності. Кортежі мають структуру, списки мають порядок.

Використання цього розрізнення робить код більш явним і зрозумілим.

Одним із прикладів можуть бути пари номерів сторінки та рядка до посилань на місця в книзі, наприклад:

my_location = (42, 11)  # page number, line number

Потім ви можете використовувати це як ключ у словнику для зберігання приміток про місця. Список з іншого боку може бути використаний для зберігання декількох місць. Звичайно, ви можете додати або видалити місця зі списку, тому має сенс, що списки можна змінювати. З іншого боку, немає сенсу додавати або видаляти елементи з існуючого місця - отже, кортежі незмінні.

Можуть виникнути ситуації, коли ви хочете змінити елементи в межах наявного кордону місцеположення, наприклад, під час повторення через рядки сторінки. Але незмінність кортежу змушує вас створювати нове кортеж розташування для кожного нового значення. Це здається незручним для цього, але використання таких змінних даних, як це, є наріжним каменем значущих типів та функціональних методів програмування, які можуть мати суттєві переваги.

У цьому питанні є кілька цікавих статей, наприклад, "кортежі Python - це не просто постійні списки" або "Розуміння кортежів і списків на Python" . Про це згадується і в офіційній документації Python

"Кортежі незмінні і зазвичай містять неоднорідну послідовність ...".

У статично введеній мові, як Haskell, значення в кортежі, як правило, мають різні типи, а довжина кортежу повинна бути фіксована. У списку значення мають однаковий тип, а довжина не фіксована. Тож різниця дуже очевидна.

Нарешті, існує назваtuple в Python, що має сенс, оскільки кортеж уже повинен мати структуру. Це підкреслює думку про те, що кортежі - це легка альтернатива класам та інстанціям.


11
+1, особливо для вашого другого посилання з чудовим прикладом. Любіть цю цитату: "Цей кортеж функціонує як легкий запис або структура".
Балтимарк

105
"списки - це однорідні послідовності" - я новачок у Python, але хіба списки неоднорідні? Від docs.python.org/py3k/tutorial/introduction.html : "Елементи списку не повинні мати однаковий тип." Але, можливо, ви говорите про формальну концепцію, а не про Python.
Меттью Корнелл

13
Хорошим смисловим синонімом "кортеж" може бути "запис". Це сукупність пов'язаних елементів даних у певній послідовності. Насправді я відчуваю, що мене collections.namedtupleб краще називати collections.record. Не було б сенсу міняти, скажімо, ім’я та адресу у записі клієнта; насправді це робиться, як правило, помилкою, яка незмінність кортежа заважає вам здійснити.
kindall

4
@nikow: Щодо того What would you do with such a list?, я завжди тремчу, коли ppl використовує відсутність фантазії як аргумент. Використання списків змішаного типу чудово працює, наприклад, для деяких ієрархічних структур даних, де кожен список складається з дочірніх списків та елементів значення.
Себастьян Мах

18
Чи не вводить в оману твердження, що кортежі неоднорідні, а списки - однорідні? Наприклад, список може містити суміші різних типів даних, тобто l = [1, 2, 'a']. Я не розумію, про що ти говориш.
Селерітас

362

Різниця між списком і кортежем

  1. Буквальне

    someTuple = (1,2)
    someList  = [1,2] 
    
  2. Розмір

    a = tuple(range(1000))
    b = list(range(1000))
    
    a.__sizeof__() # 8024
    b.__sizeof__() # 9088
    

    Через менший розмір операції кортежу це стає трохи швидше, але не так вже й багато про що згадувати, поки у вас не буде величезна кількість елементів.

  3. Дозволені операції

    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
    
  4. Використання

    Оскільки список є змінним, його не можна використовувати як ключ у словнику, тоді як кортеж можна використовувати.

    a    = (1,2)
    b    = [1,2] 
    
    c = {a: 1}     # OK
    c = {b: 1}     # Error
    

Отже, що відбувається, коли я намагаюся змінити розмір списку до великих значень? Чи змінить це адресу пам'яті (що, на мою думку, має змінити ідентифікатор). Або це викличе мені помилку?
WanderingMind

17
@WanderingMind: адреса пам'яті, де зберігаються значення списку, не є адресою пам'яті, де зберігається сам об’єкт списку.
Том

2
Гммм ... весь код у цій публікації, окрім першого поля внизу, 3. Permitted operationпоказує спочатку кортеж. Я знаю, що звичайно виявляти успіх, а потім помилку, але це заплуталося в моїй голові протягом декількох моментів.
dmckee --- кошеня колишнього модератора

1
Як показано в пункті 3, один список елементів може бути one_item_list = [a], але one_tuple = (a,)є відповідним кортежем. Зверніть увагу на кому після імені змінної. Але також зверніть увагу two_tuple = (a, b). Це не раз мене відкидало (все ще є в Python 3).
mjkrause

1
@Cheng Через те, що сортування кортежу мутирує його, тобто змінює його елементи. Кортежі цього не підтримують. Найпростіший спосіб отримати відсортований кортеж у пітоніtuple(sorted(the_unsorted_tuple))
наближенняDarknessFish

204

Якщо ви пішли на прогулянку, ви могли в будь-який момент помітити свої координати в (x,y)кортежі.

Якщо ви хочете записати свою подорож, ви можете додавати своє місцезнаходження кожні кілька секунд до списку.

Але ти не міг зробити це навпаки.


37
Цей приклад виглядає як просто умовність. Люди можуть заперечити "Я все ще можу використовувати [x, y] для позначення координат, якщо хочу". Тому ця відповідь вважається незавершеною, якщо ще одне речення: "Прочитайте пост @nikow, чому ви не повинні використовувати список для зберігання координат"
RayLuo

71
@Iceberg, моя відповідь покликана допомогти розвинути інтуїцію. Це не призначене для вивчення кожного нюансу теми.
дан-gph

8
Хороший приклад +1. Він підкреслює взаємодоповнюючий характер елементів кортежу (тут координати), що є причиною, чому змінювати будь-який з них не дозволяється - оскільки це змінює значення цілого кортежу (тут положення однієї точки).
Хао Ван

77

Ключова відмінність полягає в тому, що кортежі незмінні. Це означає, що ви не можете змінити значення в кортежі, як тільки створили його.

Тож якщо вам потрібно буде змінити значення, скористайтеся списком.

Переваги кортежів:

  1. Невелике поліпшення продуктивності.
  2. Оскільки кортеж є незмінним, його можна використовувати як ключ у словнику.
  3. Якщо ви не можете змінити це, не зможе ніхто інший, а це означає, що вам не потрібно турбуватися про будь-які функції API тощо.

14
Зауважте, що кортеж незмінний лише за наявності всіх його елементів . Можна сказати, що те ж саме стосується всіх незмінних колекцій, наприклад, frozensetабо різних заморожених диктантів / дерев / тощо. типів, але жоден із них не дозволяє додавати елементи, що змінюються. (І звичайно, кортеж є хешируемим лише у тому випадку, якщо всі його елементи є, що обробляються звичайним способом EAFP, так d[1, [2]]піднімуться TypeError: unhashable type: 'list'.)
abarnert

1
Кортеж може бути використаний як ключ у словнику, лише якщо всі його елементи незмінні. Дивіться тут
Буде Дерехам

31

Списки змінні; кортежі - ні.

Від docs.python.org/2/tutorial/datastructures.html

Кортежі незмінні і зазвичай містять неоднорідну послідовність елементів, до яких можна отримати розпакування (див. Далі в цьому розділі) або індексацію (або навіть за атрибутом у випадку названих пар). Списки є змінними, а їх елементи, як правило, однорідні та доступ до них шляхом ітерації над списком.


1
Я дійсно думаю, що ви також повинні розглянути смислові наслідки (див. Мою відповідь нижче).
nikow

Навряд чи здається, що варто докласти зусиль, але дякую за голову вгору.
duffymo

Через півроку, і це все, що ти можеш внести? Я дав цю відповідь у той час, оскільки за чотири години, що пройшли між моєю оригінальною відповіддю та коментарем, інші мали більше, ніж різницю. Чи була відповідь невірною? Не дуже, хоча це було покращено nikow. То що б посилання дійсно додало?
duffymo

4
Смішно бачити, як інші відповіді тут мають таку ж якість, як ця, але тільки ця стає ненависною через те, що один коментатор заявив "-1". І є ще одна відповідь, яка має лише в 0,5 рази більшу якість, але лише 0,1 рази нижчу оцінку.
Себастьян Мах

2
@duffymo Я думаю, що ця відповідь є найяскравішою та найкоротшою на цій сторінці. Він називає єдину дійсно важливу різницю між кортежами та списками і не безмежно блукає з приводу цього кричущо помилкового однорідного проти гетерогенного хогва.
antred

20

Це було відзначено , що різниця в основному семантична: люди очікують кортеж і список для представлення різної інформації. Але це йде далі, ніж настанова; деякі бібліотеки насправді поводяться по-різному, виходячи з того, що їм передано. Візьмемо для прикладу 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 та кортежах - зовсім інші речі.


2
Це насправді не корисна відповідь. Різниця полягає в тому type(a_list) != type(a_tuple), що будь-який фрагмент розгалуження бібліотечного коду type(x)буде вести себе по-різному
Ерік,

1
Добре, я відредагував пост: це насправді лише вказуючи на те, що семантичні настанови жорстко кодуються в деяких бібліотеках.
Шепп

1
Можливо, краще використовувати приклади з stdlib / buildins, ніж із сторонніх бібліотек. Є ряд місць, де можна використовувати одне значення або кордон значень, а список або інша послідовність вважається одним значенням. Наприклад, '%d %d' % [2, 3]є TypeError, тому що ви намагаєтеся передати список першому, %dа другому не передаєте жодного значення %d. (Однак є і зустрічні приклади до цього, як max…)
abarnert

це цікаво, я не знав, що в стандартній бібліотеці пітона є приклади цього. Кількість місць, про які ви кажете?
Шеп

18

Списки призначені для петлі, кортежі - для конструкцій, тобто "%s %s" %tuple.

Списки зазвичай однорідні, кортежі, як правило, неоднорідні.

Списки мають різну довжину, кортежі - для фіксованої довжини.


16

Це приклад списків 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-му місці на основі певного та загального масштабу чи розмірності. Елементи взяті в цілому і в основному дають відповіді на одне запитання, як правило, форми, для даного атрибута, як вони порівнюють ці об’єкти? Атрибут залишається постійним, об'єкт / предмет відрізняється.

Існує незліченна кількість прикладів людей у ​​популярній культурі та програмістів, які не відповідають цим відмінностям, і є незліченна кількість людей, які можуть використовувати салатну вилку для свого основного блюда. Зрештою, це добре, і обидва зазвичай можуть виконати роботу.

Узагальнити деякі тонші деталі

Схожість:

  1. Дублікати - обидва кортежі та списки дозволяють отримати дублікати
  2. Індексація, вибір та нарізка - індекс як списів, так і списків за допомогою цілих значень, що знаходяться в дужках. Отже, якщо ви хочете, щоб перші три значення даного списку чи кортежу, синтаксис був би таким же:

    >>> my_list[0:3]
    [0,1,2]
    >>> my_tuple[0:3]
    [a,b,c]
  3. Порівняння та сортування - два кортежі чи два списки порівнюються за їх першим елементом, а якщо є краватка, то другий елемент тощо. Подальша увага не приділяється наступним елементам після того, як попередні елементи показують різницю.

    >>> [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

Відмінності: - апріорі, за визначенням

  1. Синтаксис - Списки використовують [], кортежі використовують ()

  2. Змінюваність - Елементи в даному списку є змінними, елементи в даному кортежі НЕ змінюються.

    # 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
  3. Хештелі (словники) - Оскільки хештелі (словники) вимагають, щоб його ключі були хешбек і тому незмінні, лише ключі можуть виступати як ключі словника, а не списки.

    #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}

Відмінності - a posteriori, у використанні

  1. Гомо проти гетерогенності елементів - загалом перераховують об'єкти однорідні, а кортежні об'єкти - неоднорідні. Тобто списки використовуються для об’єктів / предметів одного типу (як і всі кандидати в президенти, або всі пісні, або всі бігуни), хоча, хоча це не вимушено), тоді як кортежі більше стосуються гетерогенних об'єктів.

  2. Looping vs. Structures - Хоча обидва дозволяють циклічно (для x у my_list ...), це дійсно має сенс робити це для списку. Кортежі є більш підходящими для структурування та подання інформації (% s% s, що перебуває у% s, є% s, а в даний час% s% ("Джон", "Уейн", 90210, "Актор", "Мертвий"))


Мені подобається приклад хешбеля / хешируемости для пояснення причини незмінності - ви можете використовувати кортеж (запис / структура / координата / вектор / точка) як складний ключ у диктат.
Дейв X

9

Значення списку можна змінювати будь-коли, але значення кортезів змінюватись не можна.

Ці переваги і недоліки залежать від використання. Якщо у вас є такі дані, які ви ніколи не бажаєте змінювати, вам доведеться використовувати кортеж, інакше список найкращий варіант.


7

Різниця між списком і кортежем

Кортежі та списки - це, здавалося б, подібні типи послідовностей у Python.

  1. Буквальний синтаксис

    Ми використовуємо дужки ( ) для побудови кортежів та квадратних дужок, [ ]щоб отримати новий список. Крім того, ми можемо використовувати виклик відповідного типу, щоб отримати потрібну структуру - кортеж або список.

    someTuple = (4,6)
    someList  = [2,6] 
  2. Змінюваність

    Кортежі незмінні, тоді як списки змінюються. Цей пункт є базовим для наступних.

  3. Використання пам'яті

    Через мутабельність вам потрібно більше пам’яті для списків і менше пам’яті для кортежів.

  4. Розширення

    Ви можете додати новий елемент до обох кортежів та списків з тією лише різницею, що ідентифікатор кортежу буде змінено (тобто у нас буде новий об’єкт).

  5. Хешинг

    Кортежі є хешируемыми, а списки - ні. Це означає, що ви можете використовувати кортеж як ключ у словнику. Список не можна використовувати як ключ у словнику, тоді як кортеж може бути використаний

    tup      = (1,2)
    list_    = [1,2] 
    
    c = {tup   : 1}     # ok
    c = {list_ : 1}     # error
  6. Семантика

    Цей пункт стосується кращої практики. Ви повинні використовувати кортежі як неоднорідні структури даних, тоді як списки - це однорідні послідовності.


1
Я проголосував тут за чітке обговорення розширення та хешингу, чого я не помітив у інакше дуже хороших існуючих відповідях.
dmckee --- кошеня колишнього модератора

6

Списки призначені для однорідних послідовностей, а кортежі - неоднорідні структури даних.


26
На даний момент ця відповідь нічого не додає до дискусії, оскільки є багато інших кращих відповідей.
Джонатан Райнхарт

5

Як люди вже відповіли тут, tuplesякі незмінні lists, але є незмінними , але є один важливий аспект використання кортежів, які ми повинні пам’ятати

Якщо tupleміститься a 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})

ми також можемо змінити словник всередині tuple як

my_tuple[4]['a'] = 500

що зробить загальний кортеж схожим

(10, 20, 30, [400, 500], {'a': 500})

Це відбувається тому , що listі dictionaryє об'єктами , і ці об'єкти не змінюється, але зміст його посилається на.

Тож tupleзалишається незмінним без жодного винятку


Цей пост було б покращено, якби ви пояснили, що "це можна змінити, навіть якщо сам кортеж незмінний". це тому, що ці об’єкти зберігають свою ідентичність при цьому (тому кортеж не змінився, оскільки він все ще містить ті самі об'єкти ...).
dmckee --- кошеня колишнього модератора

3

PEP 484 - Тип підказки говорить про те , що типи елементів покриття tupleможе бути індивідуально набрана; щоб ви могли сказати Tuple[str, int, float]; але a list, при Listклавіші набору тексту можна взяти лише один параметр типу:, List[str]який натякає, що різниця двох дійсно полягає в тому, що перший є неоднорідним, тоді як другий по суті однорідним.

Крім того, стандартна бібліотека в основному використовує кортеж як зворотне значення з таких стандартних функцій, де C поверне a struct.


3

Як люди вже згадували про відмінності, я напишу про те, чому кортежі.

Чому перевагу віддають кортежі?

Оптимізація розподілу для невеликих кортежів

Щоб зменшити фрагментацію пам'яті та пришвидшити розподіл, Python повторно використовує старі кортежі. Якщо кортеж більше не потрібен і має менше 20 елементів замість того, щоб остаточно його видалити, Python переміщує його у вільний список.

Вільний список розділений на 20 груп, де кожна група являє собою список кортежів довжиною n між 0 і 20. Кожна група може зберігати до 2000 кортежів. Перша (нульова) група містить лише 1 елемент і являє собою порожній кортеж.

>>> a = (1,2,3)
>>> id(a)
4427578104
>>> del a
>>> b = (1,2,4)
>>> id(b)
4427578104

У наведеному вище прикладі ми бачимо, що a і b мають однаковий ідентифікатор. Це тому, що ми негайно окупували знищений кортеж, який був у вільному списку.

Оптимізація розподілу списків

Оскільки списки можна змінювати, Python не використовує таку ж оптимізацію, як у кортежах. Однак списки Python також мають вільний список, але він використовується лише для порожніх об'єктів. Якщо порожній список видалено або зібрано GC, він може бути використаний пізніше.

>>> a = []
>>> id(a)
4465566792
>>> del a
>>> b = []
>>> id(b)
4465566792

Джерело: https://rushter.com/blog/python-lists-and-tuples/

Чому кортежі ефективніші за списки? -> https://stackoverflow.com/a/22140115


2

Цитата напряму з документації на 5.3. Кортежі та послідовності :

Хоча кортежі можуть здатися схожими на списки, вони часто використовуються в різних ситуаціях та з різною метою. Кортежі незмінні і зазвичай містять неоднорідну послідовність елементів, до яких можна отримати розпакування (див. Далі в цьому розділі) або індексацію (або навіть за атрибутом у випадку названих пар). Списки є змінними , а їх елементи, як правило, однорідні та доступ до них шляхом ітерації над списком.


1

Перш за все, вони обидва є скалярними об'єктами (також відомими як складні об'єкти) в 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](Не читається)

Використання списку також може викликати помилку згладжування (два різних шляху, що вказують на один і той же об’єкт).


0

Списки змінні, а кортежі незмінні. Просто розглянемо цей приклад.

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.

Отже, було доведено, що наступний код недійсний для кортежу, оскільки ми намагалися оновити кортеж, що заборонено.


-1

Список змінюється, а кортежі незмінні. Основна відмінність між змінним та незмінним - це використання пам'яті, коли ви намагаєтеся додати елемент.

Коли ви створюєте змінну, цій змінній присвоюється деяка фіксована пам'ять. Якщо це список, призначається більше пам’яті, ніж реально використовується. Наприклад, якщо поточне призначення пам’яті становить 100 байт, коли ви хочете додати 101-й байт, можливо, буде призначено ще 100 байт (загалом у цьому випадку 200 байт).

Однак якщо ви знаєте, що не часто додаєте нові елементи, то вам слід використовувати кортежі. Tuples призначає точно потрібний об'єм пам'яті, а значить, економить пам'ять, особливо коли ви використовуєте великі блоки пам'яті.


2
Хоча щось із цього є технічно правдивим, це насправді не є вирішальною різницею між змінними та незмінними типами. Більша різниця полягає в тому, що типи змінних можуть бути змінені після побудови, тоді як непорушні типи не можуть.
Роджер Фен

1
Це теж не так. Пам'ять і незмінність не мають нічого спільного. Це просто деталі реалізації, специфічні для списків. Пам'ять також не присвоюється змінним, вона присвоюється об'єктам. Змінні - це лише посилання на ці об'єкти.
Roger Fan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.