Eu falei para você que mutação
modifica um objeto existente.
Mas, de fato, você ainda não pode de fato ver a diferença entre isso e o que fizemos com strings.
Onde você irá perceber a diferença é quando introduzimos uma nova variável.
Vamos voltar ao exemplo que vimos anteriormente,
mas agora vamos adicionar um comando de atribuição extra,
e vamos introduzir uma nova variável.
Suponha que introduzimos a variável q,
e atribuímos p a q -- isso significa que o valor de p,
que é o objeto que é esta lista,
é agora aquele que q referencia.
O importante aqui é que, depois da atribuição,
p e q referenciam a mesma lista.
Suponha que fazemos um comando de atribuição
para modificar o valor de um dos elementos de q.
Bem, isto muda o elemento 4 de q --
então, este é o elemento 4 de q,
e isso muda este valor,
para o novo ponto de exclamação.
Isso muda também o valor de p:
mesmo que o comando de atribuição não mencione p,
o fato de que p e q referenciam o mesmo objeto
significa que isto altera o valor de p.
Para mostrar a você que as coisas são diferentes com strings,
vamos tentar isso com uma string.
Veja se você adivinha o que acontece quanto tentamos usar atribuição
para substituir a primeira letra da string.
Vamos executar, para ver o que acontece.
E o que obtemos é um erro,
e obtemos um erro porque uma string não é mutável.
Não existe uma maneira de mudar o valor de uma string,
e o erro diz que não há como fazer uma atribuição a uma string --
que esse tipo de objeto, como é imutável, não suporta atribuição.
Uma diferença fundamental entre objetos mutáveis e objetos imutáveis
é que, se o objeto for mutável,
então temos que nos preocupar com outras variáveis que possam referenciar esse mesmo objeto.
Podemos modificar o valor desse objeto,
e isso afetar não apenas a variável que pensamos estar alterando,
mas afetar também outra variáveis.
Vamos ver um exemplo disso.
Eu inicializei p com uma lista contendo as strings 'H', 'e', 'l', 'l', 'o'.
Agora, eu tenho uma atribuição que introduz uma nova variável q,
e atribuo p a esta variável.
E vamos imprimir os valores de p e de q,
e var que ambas, p e q, contêm a string "Hello".
Mas, agora, vamos modificar o valor na posição 0.
Agora, temos uma atribuição que armazena,
na posição 0 de p, a letra 'Y'.
Isso modifica o valor de p.
O que pode ser surpresa é que isso também altera o valor de q.
Mesmo que não tenhamos usado q na atribuição,
isso podifica o valor de q, porque q
referencia o mesmo objeto que p.