Was ist der Unterschied zwischen Listen, die in Python in eckigen Klammern und Klammern stehen?

174
>>> x=[1,2]
>>> x[1]
2
>>> x=(1,2)
>>> x[1]
2

Sind beide gültig? Wird man aus irgendeinem Grund bevorzugt?

qazwsx
quelle
3
Nur zu Ihrer Information: Es gibt einen tieferen Unterschied zwischen (i for i in ...)und [i for i in ...].
Rik Poggi
2
@RikPoggi Was ist der tiefgreifende Unterschied? Könnten Sie bitte näher darauf eingehen?
Qazwsx
11
Der erste ist ein Generatorausdruck und der zweite ist ein Listenverständnis . Einige Informationen finden Sie hier: Offizielles Tutorial zum Listenverständnis , PEP 289 . Und hier einige Fragen zum Betriebssystem: Generatorausdrücke vs. Listenverständnis , Generatorverständnis .
Rik Poggi

Antworten:

275

Eckige Klammern sind Listen, während Klammern Tupel sind .

Eine Liste ist veränderbar, dh Sie können ihren Inhalt ändern:

>>> x = [1,2]
>>> x.append(3)
>>> x
[1, 2, 3]

während Tupel nicht sind:

>>> x = (1,2)
>>> x
(1, 2)
>>> x.append(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'

Der andere Hauptunterschied besteht darin, dass ein Tupel hashbar ist, was bedeutet, dass Sie es unter anderem als Schlüssel für ein Wörterbuch verwenden können. Beispielsweise:

>>> x = (1,2)
>>> y = [1,2]
>>> z = {}
>>> z[x] = 3
>>> z
{(1, 2): 3}
>>> z[y] = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

Beachten Sie, dass Sie, wie viele Leute bereits betont haben, Tupel hinzufügen können. Beispielsweise:

>>> x = (1,2)
>>> x += (3,)
>>> x
(1, 2, 3)

Dies bedeutet jedoch nicht, dass Tupel veränderlich sind . Im obigen Beispiel wird ein neues Tupel erstellt, indem die beiden Tupel als Argumente addiert werden. Das ursprüngliche Tupel wird nicht geändert. Beachten Sie Folgendes, um dies zu demonstrieren:

>>> x = (1,2)
>>> y = x
>>> x += (3,)
>>> x
(1, 2, 3)
>>> y
(1, 2)

Wenn Sie dasselbe Beispiel mit einer Liste yerstellen würden , würde dies ebenfalls aktualisiert:

>>> x = [1, 2]
>>> y = x
>>> x += [3]
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]
jterrace
quelle
1
gute und doch einfache Beispiele, um die Unterschiede aufzulisten. Vielen Dank!
Dr. Essen
8

Ein interessanter Unterschied:

lst=[1]
print lst          // prints [1]
print type(lst)    // prints <type 'list'>

notATuple=(1)
print notATuple        // prints 1
print type(notATuple)  // prints <type 'int'>
                                         ^^ instead of tuple(expected)

Ein Komma muss in einem Tupel enthalten sein, auch wenn es nur einen einzigen Wert enthält. zB (1,)statt (1).

Saurav Sahu
quelle
Danke dir. Das habe ich gesucht. Der Code, den ich sah, hatte eine (Liste1 + Liste2 + Liste3) und gab eine Liste zurück, kein Tupel.
HuckIt
4

Sie sind keine Listen, sie sind eine Liste und ein Tupel. Informationen zu Tupeln finden Sie im Python-Tutorial. Während Sie Listen mutieren können, ist dies mit Tupeln nicht möglich.

In [1]: x = (1, 2)

In [2]: x[0] = 3
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/user/<ipython console> in <module>()

TypeError: 'tuple' object does not support item assignment
Gandaro
quelle
3

Ein anderer Unterschied zwischen Klammern und Klammern besteht darin, dass eckige Klammern ein Listenverständnis beschreiben können, z [x for x in y]

Während die entsprechenden parenthetic Syntax gibt ein Tupel - Generator :(x for x in y)

Sie können ein Tupelverständnis erhalten, indem Sie: tuple(x for x in y)

Siehe: Warum gibt es in Python kein Tupelverständnis?

xyzzy71
quelle
2

Das erste ist eine Liste, das zweite ist ein Tupel. Listen sind veränderlich, Tupel nicht.

Schauen Sie sich den Abschnitt Datenstrukturen des Lernprogramms und den Abschnitt Sequenztypen der Dokumentation an.

NPE
quelle
2

Kommagetrennte Elemente, die von (und eingeschlossen )sind tuple, sind s, diejenigen, die von [und eingeschlossen sind , ]sind lists.

0605002
quelle
1
Es gibt keine Listen, die in "runde" Klammern eingeschlossen sind, sie sind Tupel! Aber du meinst wahrscheinlich das Richtige. :P
Gandaro
1
Von (und) eingeschlossene Listen sind Tupel . Ich bin verwirrt, sind sie Listen oder Tupel?
Juliomalegria
@ julio.alegria Ich denke, was @FlopCoder schreiben wollte, war " Artikel eingeschlossen von( und )sind tuples, jene eingeschlossen durch [und ]sind lists.“
Funroll