44 Stimmen

Warum macht ein Komma am Ende eines Variablennamens diesen zu einem Tupel?

Ich möchte wissen, warum das Hinzufügen eines nachgestellten Kommas nach einem Variablennamen (in diesem Fall eine Zeichenkette) diesen zu einem tuple . d.h.

>>> abc = 'mystring',
>>> print(abc)
('mystring',)

Wenn ich drucke abc gibt es die tuple ('mystring',) .

45voto

Ben James Punkte 113987

Es sind die Kommas, nicht die Klammern, die von Bedeutung sind. Im Python-Tutorial heißt es:

Ein Tupel besteht aus einer Reihe von Werten, die durch Kommas getrennt sind

Klammern werden an anderen Stellen, an denen Kommas verwendet werden, zur Disambiguierung eingesetzt, z. B. zur Verschachtelung oder zur Eingabe eines Tupels als Teil einer Argumentliste.

Siehe die Python Tutorial Abschnitt über Tupel und Sequenzen

12voto

Philipp Punkte 45643

Denn dies ist die einzige Möglichkeit, ein Tupel-Literal mit einem Element zu schreiben. Bei Listenliteralen machen die notwendigen Klammern die Syntax eindeutig, aber da Paranthesen auch eine Gruppierung bezeichnen können, wird ein Ausdruck, der in Klammern eingeschlossen ist, nicht zu einem Tupel: Sie benötigen ein anderes syntaktisches Element, in diesem Fall das Komma.

6voto

Manoj Govindan Punkte 68109

Update

Siehe oben für eine viel bessere Antwort .

Original-Antwort

In Python wird ein Tupel durch Klammern gekennzeichnet .

Tupel werden nicht durch Klammern gekennzeichnet. Jeder Ausdruck kann in Klammern eingeschlossen werden, das ist nichts Besonderes für Tupel. Es ist nur so, dass es fast immer notwendig ist, Klammern zu verwenden, weil es sonst mehrdeutig wäre, weshalb die __str__ y __repr__ Methoden auf ein Tupel werden sie angezeigt.

Ich korrigiere mich (ich habe heute nichts anderes getan. Seufz).

Zum Beispiel:

abc = ('my', 'string')

Was ist mit Einzelelement-Tupeln? Die Klammerschreibweise gilt nach wie vor.

abc = ('mystring',)

Bei allen Tupeln kann die Klammer weggelassen werden, aber das Komma muss drinbleiben.

abc = 'mystring', # ('mystring',)

O

abc = 'my', 'string', # ('my', 'string',)

Was bedeutet das konkret? Sie war die Schaffung eines Einzelelement-Tupel im Gegensatz zu einer Zeichenkette.

El Dokumentation sagt eindeutig:

Eine Ausdrucksliste, die mindestens ein Komma enthält, ergibt ein Tupel. Die Länge des Tupels entspricht der Anzahl der Ausdrücke in der Liste. Die Ausdrücke werden von links nach rechts ausgewertet.

1voto

Mukti Punkte 31

Entpacken eines Multi-Element-Tupels:

a, b = (12, 14)

print type(a)

Ausgabe:

イント

Entpacken eines Einzelelement-Tupels:

a, = (12, )

print type(a)

Ausgabe:

イント

Ansonsten:

a = (12,)

print type(a)

Ausgabe:

Tupel

0voto

PaulG Punkte 2703

Wenn Sie ein Komma nach einem einzelnen Wert sehen, wird dieser Wert als Datentyp "Tupel" interpretiert.

Hier ist etwas, das ich aus Erfahrung gelernt habe und das vielleicht auf einige von Ihnen zutrifft:

Wenn Sie Musiker sind, kann das Wort Tupel verwirrend sein, da die Wörter Tupel und Tripel verwendet werden, um Gruppierungen von Noten zu beschreiben, die innerhalb einer bestimmten Taktart verwendet werden, mit der sie nicht streng kompatibel sind. Zum Beispiel eine Gruppierung von zwei Achtelnoten, die so gespielt werden, als ob die Taktart 4/4 wäre (straight feel), obwohl die Taktart 6/8 ist (triplet feel). Oder umgekehrt eine Triole, die im 4/4-Takt gespielt wird. Dies führt dazu, dass der unerfahrene Programmierer ein Tupel vielleicht als ein Wertepaar interpretiert.

Dies ist nicht die gleiche Art von Tupel, wie man sie in der Programmierung sieht. Bei diesen Tupeln handelt es sich um einen unveränderlichen (einmal zugewiesenen) Sequenzdatentyp, der eine beliebige Anzahl von Werten enthalten kann, die jedoch zusammen übertragen werden können, als ob sie alle zwischen Klammern eingeschlossen wären, oder anders gesagt, ein Tupel aus Klammern.

Sobald ein Tupel zugewiesen ist, kann man nichts mehr hinzufügen oder löschen, daher wird es normalerweise zum Ein- und Auspacken von Variablen verwendet. Ich verwende es häufig, um mehrere Werte aus einer Funktion zurückzugeben:

def somefunction_foo(some_data_file):
    map1 = dict()
    map2 = dict()
    map3 = dict()

    with open(datafile, 'r') as file: # auto-close the file after this block
        for row in file:
            pass
            # don't actually pass, but 
            # fill each map with specific data from the same file

    return map1, map2, map3  # I'm returning a tuple, but without parenthesis

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X