În Python, când ar trebui să utilizați liste și atunci când tupluri?
Uneori n't au o alegere, de exemplu, dacă aveți
"hello %s you are %s years old" % x
atunci x trebuie să fie un tuplu.
Dar dacă eu sunt cel care proiectează API și ajunge să alegeți tipurile de date, atunci ce sunt liniile directoare?
Tupluri dimensiune fixă în natură întrucât liste sunt dinamice. Cu alte cuvinte, un tuplu` este imuabil întrucât o "listă" este mutabil.
Tupluri sunt mai rapide decât liste. Daca're definirea unei constante set de valori și tot ce're de gând vreodată să facă cu ea se repeta prin ea, utilizați un tuplu în loc de o listă.
Face codul mai sigur dacă "scrie-proteja" de date care nu are nevoie să fie schimbat. Folosind un tuplu în loc de o listă este ca având un implicite susțin afirmația că aceste date este constantă, și că, special gândit (și o funcție specifică) este necesar pentru a trece peste asta.
Unele tupluri poate fi folosit ca dicționar chei (în special, tupluri care conțin valori invariabile ca siruri de caractere, numere, și alte tupluri). Liste nu poate fi folosit ca dicționar cheile, pentru că listele nu sunt imuabile.
Nu's o cultură puternică de tupluri fiind eterogene colecții, similar cu ceea ce'd folosi struct în C, și liste pentru colecții omogene, similare cu ceea ce ai'd folosi tablouri pentru. Dar eu'am niciodată destul de pătrat cu mutabilitatea problema menționat în alte răspunsuri. Mutabilitatea are dinți să-l (de fapt, poate't schimba un tuplu), în timp ce omogenitatea nu este pusă în aplicare, și așa pare a fi mult mai puțin interesantă distincție.
Eu cred (și nu sunt deloc bine-versat în Python) că principala diferență este că un tuplu este imuabil (se poate't fi schimbat după misiune) și o listă este mutabil (puteți adăuga, modifica, scădere, etc.).
Deci, am tendința să-mi fac tupluri lucruri pe care ar trebui't schimba după misiune și listele mele lucruri care pot.
Trebuie să fie mutabil? Utilizați o listă. Trebuie să nu fie stătătoare? Utilizați un tuplu.
În caz contrar, se's o chestiune de alegere.
Pentru colectii de obiecte eterogene (cum ar fi o adresa rupt în numele, strada, oraș, stat și zip) eu prefer să folosesc un tuplu. Ele pot fi întotdeauna ușor de promovat la nume tupluri.
De asemenea, în cazul în care colectarea se va fi reiterat peste, prefer o listă. Daca's doar un recipient pentru a organiza mai multe obiecte ca unul, prefer un tuplu.
Primul lucru pe care aveți nevoie pentru a decide dacă structura de date trebuie să fie ușor de mutat sau nu. Cum a fost menționat, listele sunt mutabile, tupluri nu sunt. Acest lucru înseamnă, de asemenea, că tupluri poate fi folosit pentru dicționar chei, unde liste nu se poate.
În experiența mea, tupluri sunt utilizate în general în cazul în care ordinea și poziția este semnificativ și consistent. De exemplu, în crearea unei structuri de date pentru a o alege propriul joc de aventura, am ales să folosesc tupluri în loc de liste pentru că poziția în tuplu fost semnificative. Aici este un exemplu din care structura de date:
pages = {'foyer': {'text' : "some text",
'choices' : [('open the door', 'rainbow'),
('go left into the kitchen', 'bottomless pit'),
('stay put','foyer2')]},}
Prima poziție în tuplu este alegerea afișat pentru utilizator, atunci când se joacă jocul și a doua poziție este cheia de pagina care alegerea se duce să-și acest lucru este în concordanță pentru toate paginile.
Tupluri sunt, de asemenea, mai multă memorie eficient decât liste, deși am'm nu sunt sigur că atunci când beneficiul devine evident.
De asemenea, a verifica afară de capitolele pe liste și tupluri în Cred Python.
Dar dacă eu sunt cel care proiectează API și ajunge să alegeți tipurile de date, atunci ce sunt liniile directoare?
Pentru parametrii de intrare it's cel mai bun de a accepta cele mai generic interfață care face ceea ce ai nevoie. Rareori este doar un tuplu sau o listă - cel mai adesea's secvență, ușor de feliat sau chiar iterable. Python's duck typing devine, de obicei, gratuit, cu excepția cazului în mod explicit verifica tipuri de intrare. Don't face asta decât dacă este absolut inevitabilă.
Pentru datele pe care le produce (parametrii de ieșire) întoarce doar ce's cel mai convenabil pentru tine, de exemplu, întoarcerea orice tip de date vă păstrați sau oricare ar fi funcția de helper se întoarce.
Un lucru de a păstra în minte este de a evita returnarea de o listă (sau orice alte mutabil), care's partea de starea ta, de exemplu
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
Un minor, dar notabil avantaj de o listă de peste un tuplu este că listele tind să fie ușor mai portabil. Standard de instrumente sunt mai puțin probabil să sprijine tupluri. JSON, de exemplu, nu au un tip tuplu. YAML, dar sintaxa ei este urâtă în comparație cu lista sa de sintaxă, care este destul de frumos.
În aceste cazuri, ați putea dori să utilizați un tuplu pe plan intern, apoi se convertească la listă, ca parte a procesului de export. Alternativ, ați putea dori să utilizați liste de consistență.