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]
Í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:
list.append()– adiciona um único item ao fim.list.extend()– anexa todos os itens de um iterável.list.insert()– insere em uma dada posição.list.remove()– exclui a primeira ocorrência de um valor.list.pop()– remove e retorna um item (o último, por padrão).list.clear()– remove todos os itens.list.sort()– ordena no próprio local. Passereverse=Truepara ordem decrescente.list.reverse()– inverte no próprio local.
>>> 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.intesta 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.
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.