В чем разница между списками и кортежами?

@ Предложение Rynant InitializationScript велико

Я думал, что цель блоков (скриптов) состоит в том, чтобы вы могли их передавать. Так что, в зависимости от того, как вы это делаете, я бы сказал: «

$FOO = {write-host "HEY"}

Start-Job -ScriptBlock $FOO | wait-job |Receive-Job

Конечно, вы можете также параметризовать блоки скриптов:

$foo = {param($bar) write-host $bar}

Start-Job -ScriptBlock $foo -ArgumentList "HEY" | wait-job | receive-job
951
задан Chris_Rands 12 December 2016 в 12:50
поделиться

6 ответов

Кроме кортежей, являющихся неизменным существует также семантическое различие, которое должно вести их использование. Кортежи являются структурами гетерогенных данных (т.е. их записи имеют различные значения), в то время как списки являются гомогенными последовательностями. Кортежи имеют структуру, списки имеют порядок.

Используя это различие делает код более явным и понятным.

Одним примером были бы пары номера страницы и номера строки к ссылочным местоположениям в книге, например:

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

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

могли бы быть ситуации, где Вы хотите изменить объекты в существующем кортеже местоположения, например, при итерации через строки страницы. Но неизменность кортежа вынуждает Вас создать новый кортеж местоположения для каждого нового значения. Это кажется неудобным на первый взгляд, но использование неизменных данных как это является краеугольным камнем типов значения и методов функционального программирования, которые могут иметь существенные преимущества.

существуют некоторые интересные статьи об этой проблеме, например, "Кортежи Python Не являются Просто Постоянными Списками" или "Кортежи понимания по сравнению со списками в Python" . Официальная документация Python также упоминания, это

"Кортежи неизменно, и обычно содержит неоднородную последовательность...".

На статически типизированном языке как Haskell значения в кортеже обычно имеют различные типы, и длина кортежа должна быть зафиксирована. В списке значения у всех есть тот же тип, и длина не фиксируется. Таким образом, отличие является очень заметным.

Наконец существует namedtuple в Python, который имеет смысл, потому что кортеж, как уже предполагается, имеет структуру. Это подчеркивает идею, что кортежи являются легкой альтернативой классам и экземплярам.

977
ответ дан trdngy 12 December 2016 в 22:50
поделиться
  • 1
    На самом деле последняя часть о SoftReference не будет работать с GC подсчета ссылок, поскольку объекты собраны независимо от ситуации с памятью. Но мне действительно нравится это, Вы разъяснили, что это работает надежно на языки с трассировкой GC. – Ken Wayne VanderLinde 21 August 2011 в 06:10

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

6
ответ дан pquers 12 December 2016 в 22:50
поделиться

Основное отличие - то, что кортежи неизменны. Это означает, что Вы не можете изменить значения в кортеже, как только Вы создали его.

Поэтому, если Вы испытываете необходимость для изменения значений, используют Список.

Преимущества для кортежей:

  1. Небольшое повышение производительности.
  2. , Поскольку кортеж неизменен, он может использоваться в качестве ключа в словаре.
  3. , Если Вы не можете изменить его, ни можете кто-либо еще, который должен сказать, Вы не должны волноваться ни о каких API-функциях, и т.д. изменяющих Ваш кортеж без того, чтобы быть спрошенным.
74
ответ дан tmthyjames 12 December 2016 в 22:50
поделиться

Если бы Вы вышли на прогулку, то Вы могли бы отметить свои координаты в любой момент в (x,y) кортеж.

, Если Вы хотели записать свою поездку, Вы могли бы добавить свое местоположение каждые несколько секунд к списку.

, Но Вы не могли сделать этого наоборот.

193
ответ дан AGN Gazer 12 December 2016 в 22:50
поделиться
  • 1
    таким образом, если я понимаю Вас правильно, Rich действительно жалуется, что в Схеме ноль оценивает к истинному (вместо лжи) в условных выражениях? Это действительно походит на плохой дизайн мне. – Nathan Davis 21 May 2011 в 02:26

Списки изменяемы; кортежи не.

От docs.python.org/2/tutorial/datastructures.html

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

31
ответ дан duffymo 12 December 2016 в 22:50
поделиться

Поскольку люди уже упомянули различия, которые я запишу о почему кортежи.

, Почему кортежи предпочтены?

оптимизация Выделения для маленьких кортежей

, Чтобы уменьшить фрагментацию памяти и ускорить выделения, повторные использования 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 также имеют бесплатный список, но он используется только для пустых объектов. Если пустой список удален или собран GC, он может быть снова использован позже.

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

Источник: https://rushter.com/blog/python-lists-and-tuples /

, Почему кортежи эффективны, чем списки? -> https://stackoverflow.com/a/22140115

1
ответ дан Pygirl 4 November 2019 в 06:29
поделиться
  • 1
    Downvoted, потому что you' ре, опускающее сказать, что это небезопасно для производственного кода и вероятно перестать работать в любое время. Повышение исключений через код платформы не является опцией в Какао. – Nikolai Ruhe 29 October 2013 в 17:05
Другие вопросы по тегам:

Похожие вопросы: