Die anderen antworteten unten, aber ich möchte darauf hinweisen, dass Python imho einen völlig unintuitiven Datentypnamen hat. Ich glaube nicht, dass eine andere Sprache Tupel (mit diesem Namen) hat, und was noch schlimmer ist als ein Wort, ich kann es nicht einmal in meine Sprache übersetzen. Weiß jemand, woher "Tupel" kommt? Niederländisch ?
Turm
98
Tupel sind ein Grundbegriff in der Mathematik, der vom Lateinischen abgeleitet ist (siehe Wikipedia).
Nikow
129
Paar -> Dreifach -> Vierfach -> Fünffach -> Sextupel -> ähm, wie heißt es, ah sod it, 7-Tupel -> 8-Tupel -> ... daher 'Tupel' als Gattungsname.
John Fouhy
31
@ JohnFouhy Es ist über sechs Jahre später, aber: ... Heptuple, Octuple, Tuple-mit-neun-Elementen, Decuple, Undecuple, Dodecuple ...: D
Augusta
18
@ MegaWidget Ich dachte, wir hätten festgestellt, dass ein Nicht-Doppel ein list. ; D
Augusta
Antworten:
1017
Abgesehen davon, dass Tupel unveränderlich sind, gibt es auch eine semantische Unterscheidung, die ihre Verwendung leiten sollte. Tupel sind heterogene Datenstrukturen (dh ihre Einträge haben unterschiedliche Bedeutungen), während Listen homogene Sequenzen sind. Tupel haben Struktur, Listen haben Reihenfolge.
Die Verwendung dieser Unterscheidung macht Code expliziter und verständlicher.
Ein Beispiel wären Seiten- und Zeilennummernpaare zu Referenzpositionen in einem Buch, z.
my_location =(42,11)# page number, line number
Sie können dies dann als Schlüssel in einem Wörterbuch verwenden, um Notizen zu Orten zu speichern. Eine Liste hingegen könnte zum Speichern mehrerer Speicherorte verwendet werden. Natürlich möchte man vielleicht Orte zur Liste hinzufügen oder daraus entfernen, daher ist es sinnvoll, dass Listen veränderbar sind. Andererseits ist es nicht sinnvoll, Elemente zu einem vorhandenen Speicherort hinzuzufügen oder daraus zu entfernen - daher sind Tupel unveränderlich.
Es kann Situationen geben, in denen Sie Elemente innerhalb eines vorhandenen Standorttupels ändern möchten, z. B. wenn Sie durch die Zeilen einer Seite iterieren. Die Unveränderlichkeit von Tupeln zwingt Sie jedoch dazu, für jeden neuen Wert ein neues Standorttupel zu erstellen. Dies scheint auf den ersten Blick unpraktisch zu sein, aber die Verwendung unveränderlicher Daten wie dieser ist ein Eckpfeiler von Werttypen und funktionalen Programmiertechniken, die erhebliche Vorteile haben können.
"Tupel sind unveränderlich und enthalten normalerweise eine heterogene Sequenz ...".
In einer statisch typisierten Sprache wie Haskell haben die Werte in einem Tupel im Allgemeinen unterschiedliche Typen und die Länge des Tupels muss festgelegt werden. In einer Liste haben alle Werte den gleichen Typ und die Länge ist nicht festgelegt. Der Unterschied ist also sehr offensichtlich.
Schließlich gibt es das Namedtuple in Python, was sinnvoll ist, da ein Tupel bereits eine Struktur haben soll. Dies unterstreicht die Idee, dass Tupel eine leichte Alternative zu Klassen und Instanzen sind.
+1, besonders für Ihren zweiten Link mit einem guten Beispiel. Ich liebe dieses Zitat: "Dieses Tupel fungiert als leichtgewichtige Aufzeichnung oder Struktur."
Baltimark
105
"Listen sind homogene Sequenzen" - Ich bin neu in Python, aber sind Listen nicht heterogen? Aus docs.python.org/py3k/tutorial/introduction.html : " Listenelemente müssen nicht alle denselben Typ haben." Aber vielleicht sprechen Sie über das formale Konzept und nicht über Python.
Matthew Cornell
13
Ein gutes semantisches Synonym für "Tupel" könnte "Datensatz" sein. Es ist eine Sammlung verwandter Datenelemente in einer bestimmten Reihenfolge. Tatsächlich fühle ich mich collections.namedtuplebesser angerufen collections.record. Es wäre nicht sinnvoll, beispielsweise den Namen und die Adresse in einem Kundendatensatz auszutauschen. In der Tat wäre dies im Allgemeinen ein Fehler, den Sie aufgrund der Unveränderlichkeit des Tupels nicht begehen können.
Kindall
4
@nikow: In Bezug darauf zittere What would you do with such a list?ich immer, wenn Leute mangelnde Fantasie als Argument verwenden. Die Verwendung von Listen mit gemischten Typen eignet sich hervorragend, z. B. für einige hierarchische Datenstrukturen, bei denen jede Liste aus untergeordneten Listen und Wertelementen besteht.
Sebastian Mach
18
Ist es nicht irreführend zu sagen, dass Tupel heterogen und Listen homogen sind? Beispielsweise kann eine Liste Mischungen verschiedener Datentypen enthalten, dh l = [1, 2, 'a']. Ich verstehe nicht, wovon du sprichst.
Celeritas
362
Unterschied zwischen Liste und Tupel
Wörtlich
someTuple =(1,2)
someList =[1,2]
Größe
a = tuple(range(1000))
b = list(range(1000))
a.__sizeof__()# 8024
b.__sizeof__()# 9088
Aufgrund der geringeren Größe einer Tupeloperation wird sie etwas schneller, aber nicht so viel zu erwähnen, bis Sie eine große Anzahl von Elementen haben.
Zulässige Operationen
b =[1,2]
b[0]=3# [3, 2]
a =(1,2)
a[0]=3# Error
Das bedeutet auch, dass Sie kein Element löschen oder ein Tupel sortieren können. Sie können jedoch sowohl der Liste als auch dem Tupel ein neues Element hinzufügen, mit dem einzigen Unterschied, dass Sie, da das Tupel unveränderlich ist, nicht wirklich ein Element hinzufügen, sondern ein neues Tupel erstellen, sodass sich die ID von ändert
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
Verwendungszweck
Da eine Liste veränderbar ist, kann sie nicht als Schlüssel in einem Wörterbuch verwendet werden, wohingegen ein Tupel verwendet werden kann.
Was passiert also, wenn ich versuche, die Listengröße auf große Werte zu ändern? Wird es die Speicheradresse ändern (was meiner Meinung nach die ID ändern sollte). Oder wird es mir einen Fehler werfen?
WanderingMind
17
@WanderingMind: Die Speicheradresse, in der die Listenwerte gespeichert sind, stimmt nicht mit der Speicheradresse überein, in der das Listenobjekt selbst gespeichert ist.
Tom
2
Hmmm ... der gesamte Code in diesem Beitrag mit Ausnahme des ersten Felds darunter 3. Permitted operationzeigt zuerst den Tupelfall. Ich weiß, dass es üblich ist, Erfolg und dann Fehler zu zeigen, aber das hat meinen Kopf für einige Momente durcheinander gebracht.
dmckee --- Ex-Moderator Kätzchen
1
Wie unter Punkt 3 gezeigt, kann eine einzelne Elementliste sein one_item_list = [a], ist aber one_tuple = (a,)das entsprechende Tupel. Beachten Sie das Komma nach dem Variablennamen. Aber auch beachten two_tuple = (a, b). Das hat mich mehr als einmal umgehauen (immer noch in Python 3).
Mjkrause
1
@Cheng Weil das Sortieren des Tupels es mutieren würde, dh seine Elemente ändern würde. Tupel unterstützen das nicht. Der einfachste Weg, um ein sortiertes Tupel in Python zu erhalten, isttuple(sorted(the_unsorted_tuple))
ApproachingDarknessFish
204
Wenn Sie spazieren gingen, konnten Sie Ihre Koordinaten jederzeit in einem (x,y)Tupel notieren .
Wenn Sie Ihre Reise aufzeichnen möchten, können Sie Ihren Standort alle paar Sekunden an eine Liste anhängen.
Dieses Beispiel sieht lediglich wie eine Konvention aus. Die Leute könnten argumentieren "Ich kann immer noch [x, y] verwenden, um Koordinaten zu notieren, wenn ich will". Daher gilt diese Antwort als unvollständig, es sei denn, es gibt noch einen Satz: "Lesen Sie den Beitrag von @nikow, warum Sie die Liste nicht zum Speichern von Koordinaten verwenden sollten"
RayLuo
71
@ Iceberg, meine Antwort soll helfen, die Intuition zu entwickeln. Es ist nicht dazu gedacht, jede Nuance des Themas zu untersuchen.
Dan-Gph
8
Schönes Beispiel +1. Es betont die Komplementarität der Tupelelemente (hier die Koordinaten), weshalb das Ändern eines dieser Elemente nicht zulässig ist, da dadurch die Bedeutung des gesamten Tupels (hier die Position eines Punkts) geändert wird.
Hao Wang
77
Der Hauptunterschied besteht darin, dass Tupel unveränderlich sind. Dies bedeutet, dass Sie die Werte in einem Tupel nach dem Erstellen nicht mehr ändern können.
Wenn Sie also die Werte ändern müssen, verwenden Sie eine Liste.
Vorteile für Tupel:
Leichte Leistungsverbesserung.
Da ein Tupel unveränderlich ist, kann es als Schlüssel in einem Wörterbuch verwendet werden.
Wenn Sie es nicht ändern können, kann es auch niemand anderes, dh Sie müssen sich keine Gedanken über API-Funktionen usw. machen, indem Sie Ihr Tupel ändern, ohne gefragt zu werden.
Beachten Sie, dass ein Tupel nur dann unveränderlich ist, wenn alle seine Elemente vorhanden sind . Man könnte sagen, dass dies auch für alle unveränderlichen Sammlungen gilt, wie frozensetoder für die verschiedenen eingefrorenen Diktate / Bäume / etc. Von Drittanbietern. Typen, aber keiner von diesen erlaubt es Ihnen, veränderbare Elemente hinzuzufügen. (Und natürlich ist ein Tupel nur hashbar, wenn alle seine Elemente, die auf die übliche EAFP-Weise behandelt werden, d[1, [2]]erhöht werden TypeError: unhashable type: 'list'.)
abarnert
1
Ein Tupel kann nur dann als Schlüssel in einem Wörterbuch verwendet werden, wenn alle seine Elemente unveränderlich sind. Siehe hier
Tupel sind unveränderlich und enthalten normalerweise eine heterogene Folge von Elementen, auf die durch Entpacken (siehe weiter unten in diesem Abschnitt) oder Indizieren (oder sogar durch Attribute bei benannten Tupeln) zugegriffen wird. Listen sind veränderlich und ihre Elemente sind normalerweise homogen und werden durch Iterieren über die Liste aufgerufen.
Ich denke wirklich, dass Sie auch die semantischen Implikationen berücksichtigen sollten (siehe meine Antwort unten).
Nikow
Die Mühe scheint sich jetzt kaum zu lohnen, aber danke für das Heads-up.
Duffymo
Sechs Monate später, und das ist alles, was Sie beitragen können? Ich gab diese Antwort damals, weil in den vier Stunden, die zwischen meiner ursprünglichen Antwort und dem Kommentar vergingen, andere den Unterschied mehr als wettgemacht hatten. War die Antwort falsch? Nicht wirklich, obwohl es von Nikow verbessert wurde. Was würde ein Link wirklich hinzufügen?
Duffymo
4
Es ist lustig zu sehen, wie andere Antworten hier die gleiche Qualität haben, aber nur dies wird gehasst, weil ein Kommentator "-1" sagt. Und es gibt noch eine andere Antwort, die nur das 0,5-fache der Qualität, aber nur das 0,1-fache der Downvotes hat.
Sebastian Mach
2
@duffymo Ich denke, diese Antwort ist die klarste und prägnanteste auf dieser Seite. Es nennt den einzigen wirklich wichtigen Unterschied zwischen Tupeln und Listen und plappert nicht endlos über dieses offensichtlich falsche homogene gegen heterogene Quatsch.
antred
20
Es wurde erwähnt, dass der Unterschied weitgehend semantisch ist: Die Leute erwarten, dass ein Tupel und eine Liste unterschiedliche Informationen darstellen. Dies geht jedoch über eine Richtlinie hinaus. Einige Bibliotheken verhalten sich je nach Übergabe unterschiedlich. Nehmen Sie zum Beispiel NumPy (kopiert von einem anderen Beitrag, in dem ich nach weiteren Beispielen frage):
>>>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]])
Der Punkt ist, dass NumPy zwar nicht Teil der Standardbibliothek ist, es sich jedoch um eine wichtige Python-Bibliothek handelt und dass NumPy-Listen und -Tupel völlig unterschiedliche Dinge sind.
Dies ist keine wirklich hilfreiche Antwort. Der Unterschied besteht darin type(a_list) != type(a_tuple), dass sich jeder Zweig des Bibliothekscodes, auf dem er verzweigt, type(x)anders verhält
Eric,
1
Guter Punkt, ich habe den Beitrag bearbeitet: Dies ist wirklich nur ein Hinweis darauf, dass die semantischen Richtlinien in einigen Bibliotheken fest codiert sind.
Shep
1
Es ist möglicherweise besser, Beispiele aus der stdlib / builtins als aus Bibliotheken von Drittanbietern zu verwenden. Es gibt eine Reihe von Stellen, an denen Sie einen einzelnen Wert oder ein Tupel von Werten verwenden können, und eine Liste oder eine andere Sequenz wird als einzelner Wert betrachtet. Dies ist beispielsweise '%d %d' % [2, 3]a TypeError, weil Sie versuchen, eine Liste an die erste zu übergeben, %dund Sie keinen Wert an die zweite übergeben %d. (Es gibt jedoch auch Gegenbeispiele dazu, wie max…)
abarnert
Das ist interessant, ich wusste nicht, dass es Beispiele dafür in der Python-Standardbibliothek gibt. Eine Reihe von Orten, die Sie sagen?
Shep
18
Listen sind für Schleifen, Tupel für Strukturen, dh "%s %s" %tuple.
Listen sind normalerweise homogen, Tupel sind normalerweise heterogen.
Listen sind für variable Länge, Tupel für feste Länge.
Python-Listen und -Tupel sind insofern ähnlich, als beide geordnete Wertesammlungen sind. Neben dem geringen Unterschied, dass Listen mit Klammern "[..., ...]" und Tupeln mit Klammern "(..., ...)" erstellt werden, besteht zwischen ihnen der technische Kernunterschied "fest in Python-Syntax fest codiert" ist, dass die Elemente eines bestimmten Tupels unveränderlich sind, während Listen veränderlich sind (... also sind nur Tupel hashbar und können als Wörterbuch- / Hash-Schlüssel verwendet werden!). Dies führt zu Unterschieden in der Art und Weise, wie sie verwendet werden können oder nicht (a priori durch Syntax erzwungen), und zu Unterschieden in der Art und Weise, wie Menschen sie verwenden (empfohlen als "Best Practices", a posteriori, dies ist, was intelligente Programmierer tun). Menschen geben in der Reihenfolge der Elemente.
Für Tupel bedeutet "Reihenfolge" nichts anderes als nur eine bestimmte "Struktur" zum Speichern von Informationen. Welche Werte im ersten Feld gefunden werden, kann leicht in das zweite Feld umgeschaltet werden, da jedes Werte über zwei verschiedene Dimensionen oder Skalen liefert. Sie geben Antworten auf verschiedene Arten von Fragen und haben typischerweise die Form: Welche Attribute hat ein bestimmtes Objekt / Subjekt? Das Objekt / Subjekt bleibt konstant, die Attribute unterscheiden sich.
Bei Listen bedeutet "Reihenfolge" eine Sequenz oder eine Richtung. Das zweite Element MUSS nach dem ersten Element stehen, da es auf der Grundlage einer bestimmten und gemeinsamen Skala oder Dimension an zweiter Stelle positioniert ist. Die Elemente werden als Ganzes betrachtet und geben meistens Antworten auf eine einzelne Frage, die typischerweise der Form entspricht. Wie vergleichen sich diese Objekte / Subjekte für ein bestimmtes Attribut? Das Attribut bleibt konstant, das Objekt / Subjekt unterscheidet sich.
Es gibt unzählige Beispiele von Menschen in der Populärkultur und Programmierer, die sich diesen Unterschieden nicht anpassen, und es gibt unzählige Menschen, die eine Salatgabel als Hauptgericht verwenden könnten. Am Ende des Tages ist es in Ordnung und beide können normalerweise die Arbeit erledigen.
Um einige der feineren Details zusammenzufassen
Ähnlichkeiten:
Duplikate - Sowohl Tupel als auch Listen ermöglichen Duplikate
Indizieren, Auswählen und Aufteilen - Sowohl Tupel als auch Listen werden mit ganzzahligen Werten in Klammern indiziert. Wenn Sie also die ersten 3 Werte einer bestimmten Liste oder eines bestimmten Tupels möchten, ist die Syntax dieselbe:
>>> my_list[0:3][0,1,2]>>> my_tuple[0:3][a,b,c]
Vergleichen und Sortieren - Zwei Tupel oder zwei Listen werden beide nach ihrem ersten Element verglichen, und wenn es einen Gleichstand gibt, nach dem zweiten Element und so weiter. Nachfolgende Elemente werden nicht weiter beachtet, nachdem frühere Elemente einen Unterschied aufweisen.
Wandelbarkeit - Elemente in einer vorgegebenen Liste sind wandelbar, Elemente in einem bestimmten Tupel nicht wandelbar sind.
# 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
Hashtabellen (Wörterbücher ) - Da Hashtabellen (Wörterbücher) erfordern, dass ihre Schlüssel hashbar und daher unveränderlich sind, können nur Tupel als Wörterbuchschlüssel und nicht als Listen fungieren.
#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}
Unterschiede - A posteriori, im Gebrauch
Homo vs. Heterogenität von Elementen - Im Allgemeinen sind Listenobjekte homogen und Tupelobjekte heterogen. Das heißt, Listen werden für Objekte / Subjekte des gleichen Typs verwendet (wie alle Präsidentschaftskandidaten oder alle Songs oder alle Läufer), obwohl dies nicht erzwungen wird, während Tupel eher für heterogene Objekte gelten.
Schleifen vs. Strukturen - Obwohl beide Schleifen zulassen (für x in my_list ...), ist es nur wirklich sinnvoll, dies für eine Liste zu tun. Tupel eignen sich besser zum Strukturieren und Präsentieren von Informationen (% s% s in% s sind% s und derzeit% s% ("John", "Wayne", 90210, "Actor", "Dead")).
Ich mag das Hashtable / Hashable-Beispiel zur Erklärung eines Grundes für Unveränderlichkeit - Sie können ein Tupel (Datensatz / Struktur / Koordinate / Vektor / Punkt) als komplexen Schlüssel für ein Diktat verwenden.
Dave X
9
Die Werte der Liste können jederzeit geändert werden, die Werte der Tupel können jedoch nicht geändert werden.
Die Vor- und Nachteile hängen von der Verwendung ab. Wenn Sie solche Daten haben, die Sie nie ändern möchten, sollten Sie Tupel verwenden müssen, andernfalls ist Liste die beste Option.
Tupel und Listen sind in Python scheinbar ähnliche Sequenztypen.
Wörtliche Syntax
Wir verwenden Klammern ( ), um Tupel und eckige Klammern [ ]zu erstellen und eine neue Liste zu erhalten. Wir können auch einen Aufruf des entsprechenden Typs verwenden, um die erforderliche Struktur zu erhalten - Tupel oder Liste.
someTuple =(4,6)
someList =[2,6]
Wandlungsfähigkeit
Tupel sind unveränderlich, während Listen veränderlich sind. Dieser Punkt ist die Basis für die folgenden.
Speichernutzung
Aufgrund der Veränderlichkeit benötigen Sie mehr Speicher für Listen und weniger Speicher für Tupel.
Erweitern
Sie können sowohl Tupeln als auch Listen ein neues Element hinzufügen, mit dem einzigen Unterschied, dass die ID des Tupels geändert wird (dh wir haben ein neues Objekt).
Hashing
Tupel sind hashbar und Listen nicht. Dies bedeutet, dass Sie ein Tupel als Schlüssel in einem Wörterbuch verwenden können. Die Liste kann nicht als Schlüssel in einem Wörterbuch verwendet werden, während ein Tupel verwendet werden kann
tup =(1,2)
list_ =[1,2]
c ={tup :1}# ok
c ={list_ :1}# error
Semantik
In diesem Punkt geht es mehr um bewährte Verfahren. Sie sollten Tupel als heterogene Datenstrukturen verwenden, während Listen homogene Sequenzen sind.
Meine Stimme hier für die explizite Diskussion von Erweiterung und Hashing, die ich in den ansonsten sehr guten vorhandenen Antworten nicht bemerkt habe.
dmckee --- Ex-Moderator Kätzchen
6
Listen sollen homogene Sequenzen sein, während Tupel heterogene Datenstrukturen sind.
An dieser Stelle fügt diese Antwort der Diskussion nichts hinzu, da es viele andere bessere Antworten gibt.
Jonathon Reinhart
5
Wie die Leute hier bereits geantwortet haben, tuplesdie unveränderlich listssind, während sie veränderlich sind, gibt es einen wichtigen Aspekt bei der Verwendung von Tupeln, an den wir uns erinnern müssen
Wenn das tupleein listoder ein dictionarydarin enthält, können diese geändert werden, auch wenn das tupleselbst unveränderlich ist.
Nehmen wir zum Beispiel an, wir haben ein Tupel, das eine Liste und ein Wörterbuch als enthält
my_tuple =(10,20,30,[40,50],{'a':10})
Wir können den Inhalt der Liste als ändern
my_tuple[3][0]=400
my_tuple[3][1]=500
was neues Tupel aussehen lässt
(10,20,30,[400,500],{'a':10})
Wir können auch das Wörterbuch in Tupel als ändern
my_tuple[4]['a']=500
Dadurch sieht das gesamte Tupel so aus
(10,20,30,[400,500],{'a':500})
Dies geschieht, weil listund dictionarysind die Objekte und diese Objekte ändern sich nicht, sondern der Inhalt, auf den es zeigt.
Dieser Beitrag würde verbessert, wenn Sie erklären würden, dass "diese geändert werden können, auch wenn das Tupel selbst unveränderlich ist". Dies liegt daran, dass diese Objekte währenddessen ihre Identität behalten (das Tupel hat sich also nicht geändert, da es immer noch dieselben Objekte enthält ...).
dmckee --- Ex-Moderator Kätzchen
3
Der PEP 484 - Type Hints besagt, dass die Elementtypen von a tupleeinzeln eingegeben werden können. damit du sagen kannst Tuple[str, int, float]; Eine Klasse listmit ListTypisierung kann jedoch nur einen Typparameter annehmen: List[str]Dies deutet darauf hin, dass der Unterschied der 2 tatsächlich darin besteht, dass die erstere heterogen ist, während die letztere an sich homogen ist.
Außerdem verwendet die Standardbibliothek das Tupel meistens als Rückgabewert von solchen Standardfunktionen, bei denen das C a zurückgeben würde struct.
Da die Leute bereits die Unterschiede erwähnt haben, werde ich darüber schreiben, warum Tupel.
Warum werden Tupel bevorzugt?
Zuordnungsoptimierung für kleine Tupel
Um die Speicherfragmentierung zu verringern und die Zuweisung zu beschleunigen, verwendet Python alte Tupel erneut. Wenn ein Tupel nicht mehr benötigt wird und weniger als 20 Elemente enthält, anstatt es dauerhaft zu löschen, verschiebt Python es in eine freie Liste.
Eine freie Liste ist in 20 Gruppen unterteilt, wobei jede Gruppe eine Liste von Tupeln mit einer Länge n zwischen 0 und 20 darstellt. Jede Gruppe kann bis zu 2 000 Tupel speichern. Die erste (Null-) Gruppe enthält nur 1 Element und repräsentiert ein leeres Tupel.
>>> a =(1,2,3)>>> id(a)4427578104>>>del a
>>> b =(1,2,4)>>> id(b)4427578104
Im obigen Beispiel sehen wir, dass a und b dieselbe ID haben. Das liegt daran, dass wir sofort ein zerstörtes Tupel besetzt haben, das auf der freien Liste stand.
Zuordnungsoptimierung für Listen
Da Listen geändert werden können, verwendet Python nicht die gleiche Optimierung wie in Tupeln. Python-Listen haben jedoch auch eine kostenlose Liste, die jedoch nur für leere Objekte verwendet wird. Wenn eine leere Liste von GC gelöscht oder gesammelt wird, kann sie später wiederverwendet werden.
>>> a =[]>>> id(a)4465566792>>>del a
>>> b =[]>>> id(b)4465566792
Obwohl Tupel Listen ähnlich erscheinen mögen, werden sie häufig in unterschiedlichen Situationen und für unterschiedliche Zwecke verwendet. Tupel sind unveränderlich und enthalten normalerweise eine heterogene Folge von Elementen, auf die durch Entpacken (siehe weiter unten in diesem Abschnitt) oder Indizieren (oder sogar durch Attribute bei benannten Tupeln) zugegriffen wird. Listen sind veränderlich und ihre Elemente sind normalerweise homogen und werden durch Iterieren über die Liste aufgerufen .
Liste ist veränderlich und Tupel sind unveränderlich. Der Hauptunterschied zwischen veränderlich und unveränderlich ist die Speichernutzung, wenn Sie versuchen, ein Element anzuhängen.
Wenn Sie eine Variable erstellen, wird der Variablen ein fester Speicher zugewiesen. Wenn es sich um eine Liste handelt, wird mehr Speicher zugewiesen als tatsächlich verwendet. Wenn beispielsweise die aktuelle Speicherzuweisung 100 Byte beträgt und Sie das 101. Byte anhängen möchten, werden möglicherweise weitere 100 Byte zugewiesen (in diesem Fall insgesamt 200 Byte).
Wenn Sie jedoch wissen, dass Sie nicht häufig neue Elemente hinzufügen, sollten Sie Tupel verwenden. Tuples weist genau die Größe des benötigten Speichers zu und spart somit Speicher, insbesondere wenn Sie große Speicherblöcke verwenden.
Während ein Teil davon technisch wahr ist, ist dies nicht wirklich der entscheidende Unterschied zwischen veränderlichen und unveränderlichen Typen. Der größere Unterschied besteht darin, dass veränderbare Typen nach der Konstruktion geändert werden können, unveränderliche Typen jedoch nicht.
Roger Fan
1
Das ist auch nicht der Grund. Gedächtnis und Veränderlichkeit haben nichts miteinander zu tun. Das ist einfach ein Implementierungsdetail, das für Listen spezifisch ist. Der Speicher ist auch nicht den Variablen zugeordnet, sondern den Objekten. Variablen sind dann nur Verweise auf diese Objekte.
list
. ; DAntworten:
Abgesehen davon, dass Tupel unveränderlich sind, gibt es auch eine semantische Unterscheidung, die ihre Verwendung leiten sollte. Tupel sind heterogene Datenstrukturen (dh ihre Einträge haben unterschiedliche Bedeutungen), während Listen homogene Sequenzen sind. Tupel haben Struktur, Listen haben Reihenfolge.
Die Verwendung dieser Unterscheidung macht Code expliziter und verständlicher.
Ein Beispiel wären Seiten- und Zeilennummernpaare zu Referenzpositionen in einem Buch, z.
Sie können dies dann als Schlüssel in einem Wörterbuch verwenden, um Notizen zu Orten zu speichern. Eine Liste hingegen könnte zum Speichern mehrerer Speicherorte verwendet werden. Natürlich möchte man vielleicht Orte zur Liste hinzufügen oder daraus entfernen, daher ist es sinnvoll, dass Listen veränderbar sind. Andererseits ist es nicht sinnvoll, Elemente zu einem vorhandenen Speicherort hinzuzufügen oder daraus zu entfernen - daher sind Tupel unveränderlich.
Es kann Situationen geben, in denen Sie Elemente innerhalb eines vorhandenen Standorttupels ändern möchten, z. B. wenn Sie durch die Zeilen einer Seite iterieren. Die Unveränderlichkeit von Tupeln zwingt Sie jedoch dazu, für jeden neuen Wert ein neues Standorttupel zu erstellen. Dies scheint auf den ersten Blick unpraktisch zu sein, aber die Verwendung unveränderlicher Daten wie dieser ist ein Eckpfeiler von Werttypen und funktionalen Programmiertechniken, die erhebliche Vorteile haben können.
Es gibt einige interessante Artikel zu diesem Thema, z. B. "Python-Tupel sind nicht nur konstante Listen" oder "Tupel vs. Listen in Python verstehen" . Die offizielle Python-Dokumentation erwähnt dies ebenfalls
In einer statisch typisierten Sprache wie Haskell haben die Werte in einem Tupel im Allgemeinen unterschiedliche Typen und die Länge des Tupels muss festgelegt werden. In einer Liste haben alle Werte den gleichen Typ und die Länge ist nicht festgelegt. Der Unterschied ist also sehr offensichtlich.
Schließlich gibt es das Namedtuple in Python, was sinnvoll ist, da ein Tupel bereits eine Struktur haben soll. Dies unterstreicht die Idee, dass Tupel eine leichte Alternative zu Klassen und Instanzen sind.
quelle
collections.namedtuple
besser angerufencollections.record
. Es wäre nicht sinnvoll, beispielsweise den Namen und die Adresse in einem Kundendatensatz auszutauschen. In der Tat wäre dies im Allgemeinen ein Fehler, den Sie aufgrund der Unveränderlichkeit des Tupels nicht begehen können.What would you do with such a list?
ich immer, wenn Leute mangelnde Fantasie als Argument verwenden. Die Verwendung von Listen mit gemischten Typen eignet sich hervorragend, z. B. für einige hierarchische Datenstrukturen, bei denen jede Liste aus untergeordneten Listen und Wertelementen besteht.Unterschied zwischen Liste und Tupel
Wörtlich
Größe
Aufgrund der geringeren Größe einer Tupeloperation wird sie etwas schneller, aber nicht so viel zu erwähnen, bis Sie eine große Anzahl von Elementen haben.
Zulässige Operationen
Das bedeutet auch, dass Sie kein Element löschen oder ein Tupel sortieren können. Sie können jedoch sowohl der Liste als auch dem Tupel ein neues Element hinzufügen, mit dem einzigen Unterschied, dass Sie, da das Tupel unveränderlich ist, nicht wirklich ein Element hinzufügen, sondern ein neues Tupel erstellen, sodass sich die ID von ändert
Verwendungszweck
Da eine Liste veränderbar ist, kann sie nicht als Schlüssel in einem Wörterbuch verwendet werden, wohingegen ein Tupel verwendet werden kann.
quelle
3. Permitted operation
zeigt zuerst den Tupelfall. Ich weiß, dass es üblich ist, Erfolg und dann Fehler zu zeigen, aber das hat meinen Kopf für einige Momente durcheinander gebracht.one_item_list = [a]
, ist aberone_tuple = (a,)
das entsprechende Tupel. Beachten Sie das Komma nach dem Variablennamen. Aber auch beachtentwo_tuple = (a, b)
. Das hat mich mehr als einmal umgehauen (immer noch in Python 3).tuple(sorted(the_unsorted_tuple))
Wenn Sie spazieren gingen, konnten Sie Ihre Koordinaten jederzeit in einem
(x,y)
Tupel notieren .Wenn Sie Ihre Reise aufzeichnen möchten, können Sie Ihren Standort alle paar Sekunden an eine Liste anhängen.
Aber anders herum konnte man es nicht machen.
quelle
Der Hauptunterschied besteht darin, dass Tupel unveränderlich sind. Dies bedeutet, dass Sie die Werte in einem Tupel nach dem Erstellen nicht mehr ändern können.
Wenn Sie also die Werte ändern müssen, verwenden Sie eine Liste.
Vorteile für Tupel:
quelle
frozenset
oder für die verschiedenen eingefrorenen Diktate / Bäume / etc. Von Drittanbietern. Typen, aber keiner von diesen erlaubt es Ihnen, veränderbare Elemente hinzuzufügen. (Und natürlich ist ein Tupel nur hashbar, wenn alle seine Elemente, die auf die übliche EAFP-Weise behandelt werden,d[1, [2]]
erhöht werdenTypeError: unhashable type: 'list'
.)Listen sind veränderlich; Tupel sind nicht.
Von docs.python.org/2/tutorial/datastructures.html
quelle
Es wurde erwähnt, dass der Unterschied weitgehend semantisch ist: Die Leute erwarten, dass ein Tupel und eine Liste unterschiedliche Informationen darstellen. Dies geht jedoch über eine Richtlinie hinaus. Einige Bibliotheken verhalten sich je nach Übergabe unterschiedlich. Nehmen Sie zum Beispiel NumPy (kopiert von einem anderen Beitrag, in dem ich nach weiteren Beispielen frage):
Der Punkt ist, dass NumPy zwar nicht Teil der Standardbibliothek ist, es sich jedoch um eine wichtige Python-Bibliothek handelt und dass NumPy-Listen und -Tupel völlig unterschiedliche Dinge sind.
quelle
type(a_list) != type(a_tuple)
, dass sich jeder Zweig des Bibliothekscodes, auf dem er verzweigt,type(x)
anders verhält'%d %d' % [2, 3]
aTypeError
, weil Sie versuchen, eine Liste an die erste zu übergeben,%d
und Sie keinen Wert an die zweite übergeben%d
. (Es gibt jedoch auch Gegenbeispiele dazu, wiemax
…)Listen sind für Schleifen, Tupel für Strukturen, dh
"%s %s" %tuple
.Listen sind normalerweise homogen, Tupel sind normalerweise heterogen.
Listen sind für variable Länge, Tupel für feste Länge.
quelle
Dies ist ein Beispiel für Python-Listen:
Dies ist ein Beispiel für ein Python-Tupel:
Python-Listen und -Tupel sind insofern ähnlich, als beide geordnete Wertesammlungen sind. Neben dem geringen Unterschied, dass Listen mit Klammern "[..., ...]" und Tupeln mit Klammern "(..., ...)" erstellt werden, besteht zwischen ihnen der technische Kernunterschied "fest in Python-Syntax fest codiert" ist, dass die Elemente eines bestimmten Tupels unveränderlich sind, während Listen veränderlich sind (... also sind nur Tupel hashbar und können als Wörterbuch- / Hash-Schlüssel verwendet werden!). Dies führt zu Unterschieden in der Art und Weise, wie sie verwendet werden können oder nicht (a priori durch Syntax erzwungen), und zu Unterschieden in der Art und Weise, wie Menschen sie verwenden (empfohlen als "Best Practices", a posteriori, dies ist, was intelligente Programmierer tun). Menschen geben in der Reihenfolge der Elemente.
Für Tupel bedeutet "Reihenfolge" nichts anderes als nur eine bestimmte "Struktur" zum Speichern von Informationen. Welche Werte im ersten Feld gefunden werden, kann leicht in das zweite Feld umgeschaltet werden, da jedes Werte über zwei verschiedene Dimensionen oder Skalen liefert. Sie geben Antworten auf verschiedene Arten von Fragen und haben typischerweise die Form: Welche Attribute hat ein bestimmtes Objekt / Subjekt? Das Objekt / Subjekt bleibt konstant, die Attribute unterscheiden sich.
Bei Listen bedeutet "Reihenfolge" eine Sequenz oder eine Richtung. Das zweite Element MUSS nach dem ersten Element stehen, da es auf der Grundlage einer bestimmten und gemeinsamen Skala oder Dimension an zweiter Stelle positioniert ist. Die Elemente werden als Ganzes betrachtet und geben meistens Antworten auf eine einzelne Frage, die typischerweise der Form entspricht. Wie vergleichen sich diese Objekte / Subjekte für ein bestimmtes Attribut? Das Attribut bleibt konstant, das Objekt / Subjekt unterscheidet sich.
Es gibt unzählige Beispiele von Menschen in der Populärkultur und Programmierer, die sich diesen Unterschieden nicht anpassen, und es gibt unzählige Menschen, die eine Salatgabel als Hauptgericht verwenden könnten. Am Ende des Tages ist es in Ordnung und beide können normalerweise die Arbeit erledigen.
Um einige der feineren Details zusammenzufassen
Ähnlichkeiten:
Indizieren, Auswählen und Aufteilen - Sowohl Tupel als auch Listen werden mit ganzzahligen Werten in Klammern indiziert. Wenn Sie also die ersten 3 Werte einer bestimmten Liste oder eines bestimmten Tupels möchten, ist die Syntax dieselbe:
Vergleichen und Sortieren - Zwei Tupel oder zwei Listen werden beide nach ihrem ersten Element verglichen, und wenn es einen Gleichstand gibt, nach dem zweiten Element und so weiter. Nachfolgende Elemente werden nicht weiter beachtet, nachdem frühere Elemente einen Unterschied aufweisen.
Unterschiede: - A priori per Definition
Syntax - Listen verwenden [], Tupel verwenden ()
Wandelbarkeit - Elemente in einer vorgegebenen Liste sind wandelbar, Elemente in einem bestimmten Tupel nicht wandelbar sind.
Hashtabellen (Wörterbücher ) - Da Hashtabellen (Wörterbücher) erfordern, dass ihre Schlüssel hashbar und daher unveränderlich sind, können nur Tupel als Wörterbuchschlüssel und nicht als Listen fungieren.
Unterschiede - A posteriori, im Gebrauch
Homo vs. Heterogenität von Elementen - Im Allgemeinen sind Listenobjekte homogen und Tupelobjekte heterogen. Das heißt, Listen werden für Objekte / Subjekte des gleichen Typs verwendet (wie alle Präsidentschaftskandidaten oder alle Songs oder alle Läufer), obwohl dies nicht erzwungen wird, während Tupel eher für heterogene Objekte gelten.
Schleifen vs. Strukturen - Obwohl beide Schleifen zulassen (für x in my_list ...), ist es nur wirklich sinnvoll, dies für eine Liste zu tun. Tupel eignen sich besser zum Strukturieren und Präsentieren von Informationen (% s% s in% s sind% s und derzeit% s% ("John", "Wayne", 90210, "Actor", "Dead")).
quelle
Die Werte der Liste können jederzeit geändert werden, die Werte der Tupel können jedoch nicht geändert werden.
Die Vor- und Nachteile hängen von der Verwendung ab. Wenn Sie solche Daten haben, die Sie nie ändern möchten, sollten Sie Tupel verwenden müssen, andernfalls ist Liste die beste Option.
quelle
Unterschied zwischen Liste und Tupel
Tupel und Listen sind in Python scheinbar ähnliche Sequenztypen.
Wörtliche Syntax
Wir verwenden Klammern (
), um Tupel und eckige Klammern
[ ]
zu erstellen und eine neue Liste zu erhalten. Wir können auch einen Aufruf des entsprechenden Typs verwenden, um die erforderliche Struktur zu erhalten - Tupel oder Liste.Wandlungsfähigkeit
Tupel sind unveränderlich, während Listen veränderlich sind. Dieser Punkt ist die Basis für die folgenden.
Speichernutzung
Aufgrund der Veränderlichkeit benötigen Sie mehr Speicher für Listen und weniger Speicher für Tupel.
Erweitern
Sie können sowohl Tupeln als auch Listen ein neues Element hinzufügen, mit dem einzigen Unterschied, dass die ID des Tupels geändert wird (dh wir haben ein neues Objekt).
Hashing
Tupel sind hashbar und Listen nicht. Dies bedeutet, dass Sie ein Tupel als Schlüssel in einem Wörterbuch verwenden können. Die Liste kann nicht als Schlüssel in einem Wörterbuch verwendet werden, während ein Tupel verwendet werden kann
Semantik
In diesem Punkt geht es mehr um bewährte Verfahren. Sie sollten Tupel als heterogene Datenstrukturen verwenden, während Listen homogene Sequenzen sind.
quelle
Listen sollen homogene Sequenzen sein, während Tupel heterogene Datenstrukturen sind.
quelle
Wie die Leute hier bereits geantwortet haben,
tuples
die unveränderlichlists
sind, während sie veränderlich sind, gibt es einen wichtigen Aspekt bei der Verwendung von Tupeln, an den wir uns erinnern müssenWenn das
tuple
einlist
oder eindictionary
darin enthält, können diese geändert werden, auch wenn dastuple
selbst unveränderlich ist.Nehmen wir zum Beispiel an, wir haben ein Tupel, das eine Liste und ein Wörterbuch als enthält
Wir können den Inhalt der Liste als ändern
was neues Tupel aussehen lässt
Wir können auch das Wörterbuch in Tupel als ändern
Dadurch sieht das gesamte Tupel so aus
Dies geschieht, weil
list
unddictionary
sind die Objekte und diese Objekte ändern sich nicht, sondern der Inhalt, auf den es zeigt.Das
tuple
bleibt also ausnahmslos unveränderlichquelle
Der PEP 484 - Type Hints besagt, dass die Elementtypen von a
tuple
einzeln eingegeben werden können. damit du sagen kannstTuple[str, int, float]
; Eine Klasselist
mitList
Typisierung kann jedoch nur einen Typparameter annehmen:List[str]
Dies deutet darauf hin, dass der Unterschied der 2 tatsächlich darin besteht, dass die erstere heterogen ist, während die letztere an sich homogen ist.Außerdem verwendet die Standardbibliothek das Tupel meistens als Rückgabewert von solchen Standardfunktionen, bei denen das C a zurückgeben würde
struct
.quelle
Da die Leute bereits die Unterschiede erwähnt haben, werde ich darüber schreiben, warum Tupel.
Warum werden Tupel bevorzugt?
Quelle: https://rushter.com/blog/python-lists-and-tuples/
Warum sind Tupel effizienter als Listen? -> https://stackoverflow.com/a/22140115
quelle
Ein Richtungszitat aus der Dokumentation zu 5.3. Tupel und Sequenzen :
quelle
Erstens sind beide nicht skalare Objekte (auch als zusammengesetzte Objekte bezeichnet) in Python.
+
(brandneues Tupel wird natürlich erstellt)(3,) # -> (3)
statt(3) # -> 3
[3]
new_array = origin_array[:]
[x**2 for x in range(1,7)]
gibt Ihnen[1,4,9,16,25,36]
(nicht lesbar)Die Verwendung von list kann auch einen Aliasing-Fehler verursachen (zwei unterschiedliche Pfade, die auf dasselbe Objekt verweisen).
quelle
Listen sind veränderlich und Tupel sind unveränderlich. Betrachten Sie einfach dieses Beispiel.
Ändern Sie nun die Indexwerte von Liste und Tupel.
Daher wurde bewiesen, dass der folgende Code mit Tupel ungültig ist, da wir versucht haben, ein Tupel zu aktualisieren, was nicht zulässig ist.
quelle
Liste ist veränderlich und Tupel sind unveränderlich. Der Hauptunterschied zwischen veränderlich und unveränderlich ist die Speichernutzung, wenn Sie versuchen, ein Element anzuhängen.
Wenn Sie eine Variable erstellen, wird der Variablen ein fester Speicher zugewiesen. Wenn es sich um eine Liste handelt, wird mehr Speicher zugewiesen als tatsächlich verwendet. Wenn beispielsweise die aktuelle Speicherzuweisung 100 Byte beträgt und Sie das 101. Byte anhängen möchten, werden möglicherweise weitere 100 Byte zugewiesen (in diesem Fall insgesamt 200 Byte).
Wenn Sie jedoch wissen, dass Sie nicht häufig neue Elemente hinzufügen, sollten Sie Tupel verwenden. Tuples weist genau die Größe des benötigten Speichers zu und spart somit Speicher, insbesondere wenn Sie große Speicherblöcke verwenden.
quelle