Qual é a diferença entre listas entre colchetes e parênteses no Python?


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

Ambos são válidos? É preferido por algum motivo?


3
Apenas para sua informação: há uma diferença mais profunda entre (i for i in ...)e [i for i in ...].
Rik Poggi

2
@RikPoggi Qual é a diferença profunda? Você poderia por favor elaborar?
qazwsx

11
O primeiro é uma expressão geradora e o segundo é uma compreensão de lista . Você pode encontrar algumas informações aqui: Tutorial oficial sobre compreensão de lista , PEP 289 . E aqui em algumas perguntas do SO: Expressões de Gerador vs. Compreensão de Lista , compreensão de gerador .
Rik Poggi

Respostas:


275

Parênteses rectos são listas enquanto os parênteses são tuplas .

Uma lista é mutável, o que significa que você pode alterar seu conteúdo:

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

enquanto as tuplas não são:

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

A outra principal diferença é que uma tupla é lavável, o que significa que você pode usá-la como chave de um dicionário, entre outras coisas. Por exemplo:

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

Observe que, como muitas pessoas apontaram, você pode adicionar tuplas juntas. Por exemplo:

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

No entanto, isso não significa que as tuplas são mutáveis . No exemplo acima, uma nova tupla é construída adicionando as duas tuplas como argumentos. A tupla original não é modificada. Para demonstrar isso, considere o seguinte:

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

Visto que, se você construísse esse mesmo exemplo com uma lista, ytambém seria atualizado:

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

1
exemplos bons e simples para listar as diferenças. Obrigado!
Dr. Essen

8

Uma diferença 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)

Uma vírgula deve ser incluída em uma tupla, mesmo que contenha apenas um único valor. por exemplo, em (1,)vez de (1).


Obrigado. Era isso que eu estava procurando. O código que vi tinha um (lista1 + lista2 + lista3) e retornou uma lista, não uma tupla.
HuckIt

4

Eles não são listas, são uma lista e uma tupla. Você pode ler sobre tuplas no tutorial do Python. Embora você possa alterar as listas, isso não é possível com as tuplas.

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

Outra maneira entre colchetes e parênteses é que colchetes podem descrever uma compreensão da lista, por exemplo, [x for x in y]

Enquanto a sintaxe entre parênteses correspondente especifica um gerador de tupla :(x for x in y)

Você pode obter uma compreensão da tupla usando: tuple(x for x in y)

Veja: Por que não há compreensão de tupla no Python?



2

Itens separados por vírgula delimitados por (e )são tuples, aqueles delimitados por [e ]são lists.


1
Não há listas entre colchetes, elas são tuplas! Mas você provavelmente quer dizer a coisa certa. :P
Gandaro

1
As listas delimitadas por (e) são tuplas . Estou confuso, são listas ou tuplas?
Juliomalegria 17/01/12

@ julio.alegria Acho que o que o @FlopCoder pretendia escrever era " Itens incluídos por (e )são tuples, aqueles incluídos por [e ]são lists".
Funroll
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.