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?
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?
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!