python: list vs tuple, kiedy używać każdego? [duplikat]

To pytanie ma już odpowiedź tutaj:

W Pythonie, kiedy należy używać list, a kiedy krotek?

Czasami nie masz wyboru, na przykład jeśli masz

"hello %s you are %s years old" % x

Wtedy x musi być krotką.

Ale jeśli to ja projektuję API i wybieram typy danych, to jakie są wytyczne?

Author: flybywire, 2009-11-10

7 answers

Istnieje silna kultura krotek dla zbiorów heterogenicznych, podobnych do tego, do czego używa się structs W C, oraz list dla zbiorów jednorodnych, podobnych do tablic. Ale nigdy nie doszedłem do tego z problemem zmienności wspomnianym w innych odpowiedziach. Zmienność ma zęby do niego (w rzeczywistości nie można zmienić krotki), podczas gdy jednorodność nie jest wymuszona, a więc wydaje się być znacznie mniej interesującym rozróżnieniem.

 190
Author: Ned Batchelder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-14 12:36:13

Krotki mają stały rozmiar w naturze, podczas gdy listy są dynamiczne.
Innymi słowy, a tuple jest niezmienny, podczas gdy a list jest zmienny.

  1. nie można dodawać elementów do krotki. Krotki nie mają metody append ani extend.
  2. nie można usuwać elementów z krotki. Krotki nie mają metody remove ani pop.
  3. można znaleźć elementy w krotce, ponieważ nie zmienia to krotki.
  4. Możesz również użyć operatora in, aby sprawdź, czy Element istnieje w krotce.

  • Krotki są szybsze niż listy. jeśli definiujesz stały zbiór wartości i wszystko, co zamierzasz z nim zrobić, to przejść przez niego, użyj krotki zamiast listy.

  • To sprawia, że kod jest bezpieczniejszy, jeśli "write-protect" dane, które nie muszą być zmieniane. Używanie krotki zamiast listy jest jak posiadanie domniemanego twierdzenia, że dane te są stałe i że specjalna myśl (i konkretna funkcja) jest wymagana do nadpisania tego.

  • Niektóre krotki mogą być używane jako klucze słownikowe(w szczególności krotki zawierające niezmienne wartości, takie jak ciągi znaków, Liczby i inne krotki). Listy nigdy nie mogą być używane jako klucze słownikowe, ponieważ listy nie są niezmienne.

Source: Dive into Python 3

 555
Author: jldupont,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-04 05:19:51

Wierzę (i nie jestem dobrze obeznany w Pythonie), że główną różnicą jest to, że krotka jest niezmienna (nie można jej zmienić w miejscu po przypisaniu), a lista jest zmienna (można dodawać, zmieniać, odejmować, itp.).

Więc, mam tendencję do tworzenia krotek rzeczy, które nie powinny się zmienić po przypisaniu i moje listy rzeczy, które mogą.

 75
Author: thornomad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-10 15:19:33

Czy musi być zmienny? Użyj listy. Czy nie może być zmienny? Użyj krotki.

W Przeciwnym Razie jest to kwestia wyboru.

Do kolekcji obiektów heterogenicznych (takich jak adres z podziałem na nazwę, ulicę, miasto, stan i zip) wolę używać krotki. Zawsze można je łatwo awansować do nazwanych krotek.

Podobnie, jeśli kolekcja ma być iterowana, wolę listę. Jeśli jest to tylko kontener do przechowywania wielu obiektów jako jeden, wolę krotkę.

 35
Author: AFoglia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-10 15:01:14

Pierwszą rzeczą, którą musisz zdecydować, to czy struktura danych musi być zmienna, czy nie. Jak już wspomniano, listy są zmienne, krotki nie. Oznacza to również, że krotki mogą być używane do kluczy słownikowych, gdzie listy nie mogą.

Z mojego doświadczenia wynika, że krotki są zwykle używane tam, gdzie kolejność i pozycja są znaczące i spójne. Na przykład, tworząc strukturę danych dla wybierz własną grę przygodową, zdecydowałem się użyć krotek zamiast list, ponieważ pozycja w tuple miało znaczenie. Oto jeden przykład z tej struktury danych:

pages = {'foyer': {'text' : "some text", 
          'choices' : [('open the door', 'rainbow'),
                     ('go left into the kitchen', 'bottomless pit'),
                     ('stay put','foyer2')]},}

Pierwsza pozycja w krotce to wybór wyświetlany użytkownikowi podczas gry, a druga pozycja to klucz strony, do której trafia wybór i jest to spójne dla wszystkich stron.

Krotki są również bardziej wydajne w pamięci niż listy, choć nie jestem pewien, kiedy ta korzyść staje się widoczna.

Sprawdź także rozdziały o listach i krotkach w Think Python .

 11
Author: Amanda Nyren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-10 16:06:02

Ale jeśli to ja projektuję API i wybieram typy danych, to jakie są wytyczne?

Dla parametrów wejściowych najlepiej zaakceptować najbardziej ogólny interfejs, który robi to, czego potrzebujesz. Rzadko jest to tylko krotka lub lista - częściej jest to sekwencja, krojenie lub nawet iterowalne. Pisanie kaczek w Pythonie zwykle dostaje je za darmo, chyba że jawnie sprawdzisz typy wprowadzania. Nie rób tego, chyba że absolutnie nieuniknione.

Dla danych, które tworzysz (parametry wyjściowe) po prostu zwróć to, co jest dla Ciebie najwygodniejsze, np. zwróć dowolny typ danych, który przechowujesz lub cokolwiek zwraca twoja funkcja pomocnicza.

Jedną rzeczą, o której należy pamiętać, jest unikanie zwracania listy (lub jakiejkolwiek innej mutowalnej), która jest częścią twojego stanu, np.

class ThingsKeeper
    def __init__(self):
        self.__things = []

    def things(self):
        return self.__things  #outside objects can now modify your state

    def safer(self):
        return self.__things[:]  #it's copy-on-write, shouldn't hurt performance
 9
Author: Rafał Dowgird,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-10 15:46:15

Drobną, ale zauważalną zaletą listy nad krotką jest to, że listy wydają się być nieco bardziej przenośne. Standardowe narzędzia rzadziej obsługują krotki. Na przykład JSON nie ma typu krotki. YAML tak, ale jego składnia jest brzydka w porównaniu do składni listy, co jest całkiem miłe.

W takich przypadkach możesz użyć krotki wewnętrznie, a następnie przekonwertować do listy jako część procesu eksportu. Alternatywnie, możesz używać list wszędzie dla spójności.

 2
Author: Doug F,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-09 21:05:07