2.7. Listas

Uma lista é uma sequência mutável e ordenada de valores. Ao contrário de strings e bytes, as listas podem conter valores de qualquer tipo, e você pode alterar, adicionar ou remover itens no próprio local.

2.7.1. Criando listas

Colchetes criam um literal de lista:

empty   = []
nums    = [1, 2, 3]
mixed   = [1, "two", 3.0, True, None]    # any types
nested  = [[1, 2], [3, 4], [5, 6]]       # lists of lists

O construtor list constrói uma lista a partir de qualquer iterável:

>>> list("abc")
['a', 'b', 'c']
>>> list(range(5))
[0, 1, 2, 3, 4]

2.7.2. Comprimento, indexação e fatiamento

len() retorna o número de itens. A indexação e o fatiamento funcionam da mesma forma que em strings – as posições começam em 0, índices negativos contam a partir do fim, e uma fatia fora do intervalo válido é recortada silenciosamente em vez de gerar erro:

>>> nums = [10, 20, 30, 40, 50]
>>> len(nums)
5
>>> nums[0]
10
>>> nums[-1]
50
>>> nums[1:4]
[20, 30, 40]
Uma lista de seis células, com índices positivos 0..5 acima e índices negativos -6..-1 abaixo de cada célula.

Índices positivos contam a partir do início; índices negativos contam a partir do fim.

A sintaxe de fatiamento é uma forma abreviada de um objeto slice que o Python constrói nos bastidores. nums[1:4] é o mesmo que nums[slice(1, 4)]. Você raramente constrói um manualmente, mas slice() é ocasionalmente útil para armazenar uma fatia como um valor a ser reutilizado:

head = slice(0, 3)
print(nums[head])             # [10, 20, 30]
print(letters[head])          # first three letters, same slice

2.7.3. Mutando uma lista

As listas suportam atribuição indexada e fatiada no próprio local:

>>> nums = [10, 20, 30]
>>> nums[0] = 99
>>> nums
[99, 20, 30]
>>> nums[1:3] = [200, 300, 400]    # slice can change the length
>>> nums
[99, 200, 300, 400]

Os métodos de lista mais comuns:

>>> nums = []
>>> nums.append(1)
>>> nums.extend([2, 3])
>>> nums.insert(0, 99)
>>> nums
[99, 1, 2, 3]
>>> nums.pop()
3
>>> nums.sort()
>>> nums
[1, 2, 99]

Esses métodos modificam a lista no próprio local e retornam None. Escrever

nums = nums.sort()    # nums is now None -- common bug

quase nunca é o que você quer; a nums original foi ordenada, mas a atribuição então sobrescreve o nome com o valor de retorno. Ou chame nums.sort() em sua própria linha, ou use a função embutida sorted() para obter uma nova lista ordenada de volta sem mutar a original.

2.7.4. Operadores

  • + concatena duas listas em uma nova lista.

  • * repete uma lista.

  • in testa a pertinência.

>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> [0] * 5
[0, 0, 0, 0, 0]
>>> 3 in [1, 2, 3]
True

2.7.5. Iterando sobre uma lista

Um laço for percorre os itens em ordem:

for n in [10, 20, 30]:
    print(n)

2.7.6. Aliasing e mutação

Uma lista é um único valor na memória; vários nomes podem apontar para a mesma lista. Mutar através de um nome é visível através de todos os outros nomes que apontam para a mesma lista.

Duas variáveis a e b apontando ambas para o mesmo objeto lista; anexar a a é visível através de b.

a e b apontam ambas para a mesma lista. Mutar através de qualquer um dos nomes altera o que todos os outros nomes veem.

>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4]                # same object, change is visible

Para fazer uma cópia independente, fatie a lista inteira ou chame o construtor list:

>>> c = a[:]                # or list(a)
>>> a.append(5)
>>> c
[1, 2, 3, 4]                # c is unaffected

Isso copia apenas a lista de nível superior; listas aninhadas ainda são compartilhadas entre a original e a cópia.