Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Tuplas são realmente imutáveis?

t = (1,2,[4,6])

t é uma tupla. Se fizermos:

t[2][0]="e"

teremos:

(1, 2, ['e', 6])

Agora a tupla t é (1, 2, ['e', 6])

Não alteramos a tupla?

2 respostas
solução!

Oi, Edson. As tuplas são sim imutáveis. No seu exemplo, o que você modificou foi a lista [4, 6] para ['e', 6] já que listas são mutáveis. O objeto lista guardado em t[2] continua sendo o mesmo, não podemos modificar sua referência -- mas como ele é um objeto do tipo mutável, nada nos impede de fazer essa modificação. O conteúdo imutável em uma tupla são as referências de seus elementos e não o conteúdo deles em si.

espero ter ajudado e bons estudos!

Sua pergunta é muito interessante, Edson! A Thais já matou, mas vou complementar com uma curiosidade técnica que eu acho interessante hehe.

Olha esse outro teste:

>>> t = (1,2,[4,6])
>>> t[2] += [8, 10]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t    
(1, 2, [4, 6, 8, 10])

Se a gente tentar alterar a lista dentro da nossa tupla com o operador +=, recebemos um TypeError, mas, ao mesmo tempo, a lista é sim modificada! O que acontece é que essa expressão de somar uma lista a outra, que fizemos, executa a instrução bytecode STORE_SUBSCR. Essa instrução, por sua vez, executa a função em C PyObject_SetItem(), que checa se o objeto suporta designação de itens. O que acontece é que, no caso, o objeto checado é a nossa tupla, então recebemos um TypeError, mesmo que consigamos alterar a lista! Isso, é claro, não acontece se usarmos métodos de lista como o append() ou extend().

Isso tudo não é muito importante na prática, mas é bastante interessante se você gosta do assunto. Abraços!