Quelle est la différence entre les listes entre crochets et parenthèses en Python?

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

Sont-ils tous les deux valides? Est-ce que l'un est préféré pour une raison quelconque?

qazwsx
la source
3
Juste pour info: il y a une différence plus profonde entre (i for i in ...)et [i for i in ...].
Rik Poggi
2
@RikPoggi Quelle est la différence profonde? Pourriez-vous s'il vous plaît élaborer?
qazwsx
11
Le premier est une expression génératrice et le second est une compréhension de liste . Vous pouvez trouver quelques informations ici: Tutoriel officiel sur la compréhension de listes , PEP 289 . Et ici quelques questions OS: Générateur d' expressions par rapport à la liste Comprehension , générateur de compréhension .
Rik Poggi

Réponses:

275

Les crochets sont des listes tandis que les parenthèses sont des tuples .

Une liste est modifiable, ce qui signifie que vous pouvez modifier son contenu:

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

alors que les tuples ne sont pas:

>>> 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'

L'autre différence principale est qu'un tuple peut être haché, ce qui signifie que vous pouvez l'utiliser comme clé d'un dictionnaire, entre autres. Par exemple:

>>> 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'

Notez que, comme de nombreuses personnes l'ont souligné, vous pouvez ajouter des tuples ensemble. Par exemple:

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

Cependant, cela ne signifie pas que les tuples sont mutables . Dans l'exemple ci-dessus, un nouveau tuple est construit en additionnant les deux tuples comme arguments. Le tuple d'origine n'est pas modifié. Pour illustrer cela, tenez compte des éléments suivants:

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

Alors que, si vous deviez construire ce même exemple avec une liste, yserait également mis à jour:

>>> x = [1, 2]
>>> y = x
>>> x += [3]
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]
jterrace
la source
1
bons exemples simples pour énumérer les différences. Merci!
Dr Essen le
8

Une différence intéressante:

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)

Une virgule doit être incluse dans un tuple même s'il ne contient qu'une seule valeur. par exemple (1,)au lieu de (1).

Saurav Sahu
la source
Je vous remercie. C'est ce que je cherchais. Le code que j'ai vu avait un (list1 + list2 + list3) et il a renvoyé une liste, pas un tuple.
HuckIt
4

Ce ne sont pas des listes, ce sont une liste et un tuple. Vous pouvez en savoir plus sur les tuples dans le didacticiel Python. Bien que vous puissiez muter des listes, cela n'est pas possible avec les tuples.

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
la source
3

Une autre différence entre les crochets et les parenthèses est que les crochets peuvent décrire une compréhension de liste, par exemple [x for x in y]

Alors que la syntaxe parenthétique correspondante spécifie un générateur de tuple :(x for x in y)

Vous pouvez obtenir une compréhension de tuple en utilisant: tuple(x for x in y)

Voir: Pourquoi n'y a-t-il pas de compréhension de tuple en Python?

xyzzy71
la source
2

Le premier est une liste, le second est un tuple. Les listes sont modifiables, les tuples ne le sont pas.

Jetez un œil à la section Structures de données du didacticiel et à la section Types de séquence de la documentation.

NPE
la source
2

Les éléments séparés par des virgules entre (et )sont des tuples, ceux entourés par [et ]sont des lists.

0605002
la source
1
Il n'y a pas de listes entre crochets "ronds", ce sont des tuples! Mais vous voulez probablement dire la bonne chose. :P
Gandaro
1
Les listes entourées par (et) sont des tuples . Je suis confus, sont-ils des listes ou des tuples?
juliomalegria
@ julio.alegria Je pense que ce que @FlopCoder voulait écrire était " Les éléments entourés par (et )sont des tuples, ceux entourés par [et ]sont des lists."
funroll