Como mudar itens de uma tupla
Autor: Vinicius Assef | Publicado: 2016-12-05T09:21:00-02:00




Tuplas são objetos imutáveis. Se dermos um `dir(tuple)` no IDLE do Pyton, veremos que só existem 2 métodos considerados públicos -- `count()` e `index()` -- e eles não servem para modificá-la.

Os exemplos desse artigo serão quase todos com os dados abaixo:

    >>> nome = 'Marta'
    >>> notas = {'matematica': 8.5}
    >>> brinquedos = ['mesinha', 'patins']
    >>> mesada = 10.00
    >>> t = (nome, notas, brinquedos, mesada)
    >>> t
    ('Marta', {'matematica': 8.5}, ['mesinha', 'patins'], 10.0)
    >>> 

Com tuplas, podemos acessar itens pelo indexador, como fazemos nas listas:

    >>> t[0]
    'Marta'
    >>> t[1]
    {'matematica': 8.5}
    >>> 


Mas, diferentemente das listas, não podemos alterar o conteúdo de um determinado índice:

    >>> t[0] = 'qualquer coisa'
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: 'tuple' object does not support item assignment
    >>> 


Mudar o nome (string) ou a mesada (dado numérico) não muda a tupla:

    >>> nome = 'Joana'
    >>> t[0]
    'Marta'
    >>> mesada = 15.00
    >>> t[-1]
    10.00
    >>> 

E se mudarmos as notas ou os brinquedos?

    >>> notas['portugues'] = 10.0
    >>> brinquedos.append('boneca')
    >>> t[1]
    {'matematica': 8.5, 'portugues': 10.0}
    >>> t[-2]
    ['mesinha', 'patins', 'boneca']
    >>> 

Opa! A tupla mudou?!

Para nós, mudou. Mas para o Python, não. Porque:

1. Eu não adicionei nenhum item.
1. Eu não subtraí nenhum item.
1. Eu não substituí nenhum item por outro conteúdo.

Ou seja, nossa tupla continua com os mesmos 4 itens.

Daí pode vir a pergunta

  Como assim, "os mesmos 4 itens",  se as notas e os brinquedos têm itens a mais?


Em Python, listas são sequência mutáveis e dicionários são mappings, que são mutáveis. Então, no caso de `brinquedos`, **conceitualmente** é a mesma lista, com 1 item a mais. As notas também são representadas pelo mesmo dicionário, com uma chave a mais.

Listas e dicionários podem nos pregar algumas peças de vez em quando. Leia o artigo [Como copiar uma lista e um dicionário em Python](/2012/11/como-copiar-uma-lista-e-um-dicionario.html) para entendê-los melhor.


O mesmo comportamento ocorre quando a tupla contém a instância de uma classe criada por você:

    >>> class P:
    ...   def __init__(self, nome):
    ...     self.nome = nome
    ...   def __repr__(self):
    ...     return self.nome
    ... 
    >>> pessoa = P('Eduardo')
    >>> a = [1, pessoa]
    >>> a
    (1, Eduardo)
    >>> pessoa.nome = 'Luiz'
    >>> a
    (1, Luiz)
    >>>

O último item da lista continua sendo representado pelo mesmo objeto `pessoa`. Conceitualmente, a tupla não mudou. O que mudou foi o atributo `nome` de `pessoa`.

Lembre-se: uma tupla é imutável, mas seus itens não precisam ser.

Mas se eu realmente quiser mudar, de verdade, um item da tupla? Bem, diretamente não é possível. Mas você pode fazer isso facilmente convertendo a tupla para lista e voltando para o formato original. Usando nosso exemplo do início do artigo, seria assim:

    >>> x = list(t)
    >>> x[0] = 'Luiza'
    >>> t = tuple(x)
    >>> t[0]
    'Luiza'
    >>> 

Para conhecer mais um pouco, recomendo ler a documentação oficial sobre os [Tipos Embutidos](https://docs.python.org/3/library/stdtypes.html) do Python.