Qual è la differenza tra elenchi racchiusi tra parentesi quadre e parentesi in Python?


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

Sono entrambi validi? Uno è preferito per qualche motivo?


3
Cordiali saluti: c'è una differenza più profonda tra (i for i in ...)e [i for i in ...].
Rik Poggi,

2
@RikPoggi Qual è la differenza profonda? Potresti per favore elaborare?
qazwsx,

11
Il primo è un'espressione generatrice e il secondo è una comprensione della lista . Puoi trovare alcune informazioni qui: Tutorial ufficiale sulla comprensione delle liste , PEP 289 . Ed ecco alcune domande sul sistema operativo: espressioni del generatore e comprensione della lista , comprensione del generatore .
Rik Poggi,

Risposte:


275

Le parentesi quadre sono elenchi mentre le parentesi sono tuple .

Un elenco è modificabile, il che significa che puoi modificarne il contenuto:

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

mentre le tuple non sono:

>>> 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'altra differenza principale è che una tupla è hash, nel senso che puoi usarla come chiave per un dizionario, tra le altre cose. Per esempio:

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

Si noti che, come molte persone hanno sottolineato, è possibile aggiungere insieme le tuple. Per esempio:

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

Tuttavia, ciò non significa che le tuple siano mutabili . Nell'esempio sopra, una nuova tupla viene costruita sommando le due tuple come argomenti. La tupla originale non viene modificata. Per dimostrarlo, considerare quanto segue:

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

Considerando che, se dovessi costruire questo stesso esempio con un elenco, yverrebbe anche aggiornato:

>>> x = [1, 2]
>>> y = x
>>> x += [3]
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]

1
buoni ma semplici esempi per elencare le differenze. Grazie!
Dr. Essen,

8

Una differenza interessante:

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)

Una virgola deve essere inclusa in una tupla anche se contiene solo un singolo valore. ad es. (1,)invece di (1).


Grazie. Questo è quello che stavo cercando. Il codice che ho visto aveva un (list1 + list2 + list3) e ha restituito un elenco, non una tupla.
HuckIt,

4

Non sono elenchi, sono un elenco e una tupla. Puoi leggere le tuple nel tutorial di Python. Mentre puoi mutare gli elenchi, questo non è possibile con le tuple.

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

3

Un altro modo in cui parentesi e parentesi differiscono è che le parentesi quadre possono descrivere una comprensione della lista, ad es [x for x in y]

Considerando che la sintassi parentetica corrispondente specifica un generatore di tuple :(x for x in y)

Puoi ottenere una comprensione della tupla usando: tuple(x for x in y)

Vedi: Perché non c'è comprensione della tupla in Python?


2

Il primo è un elenco, il secondo è una tupla. Le liste sono mutabili, le tuple no.

Dai un'occhiata alla sezione Strutture dati del tutorial e alla sezione Tipi di sequenza della documentazione.


2

Gli elementi separati da virgole racchiusi tra (e )sono tuples, quelli racchiusi tra [e ]sono lists.


1
Non ci sono elenchi racchiusi tra parentesi "rotonde", sono tuple! Ma probabilmente intendi la cosa giusta. :P
Gandaro,

1
Le liste racchiuse tra (e) sono tuple .. Sono confuso, sono liste o tuple?
juliomalegria,

@ julio.alegria Penso che cosa intendesse scrivere @FlopCoder era " Gli elementi racchiusi da (e )sono tuples, quelli racchiusi da [e ]sono lists".
funroll
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.