Introdução à programação e aos algoritmos
6.1.1 Strings São Imutáveis
n
t
o
Você pode obter o mesmo resultado com o Programa 6.5, mas
usar range() não é a melhor solução. Prefira a primeira versão, que percorre a string diretamente.
frase = ‘Celacanto’
for i in range(len(frase)):
print(frase[i])
■ Programa 6.5: Percorrendo uma string com range().
EXERCÍCIO 6.1
Escreva uma função que escreva na tela 100 vezes a frase ‘Romani ite domum’.
6.1.1 STRINGS SÃO IMUTÁVEIS
Talvez o aspecto mais importante para se aprender sobre strings em Python é que são objetos imutáveis! Sim, como os inteiros, cada vez que você modifica um caractere de uma string, o interpretador cria um novo objeto string. Mesmo que seja tentador fazer uma atribuição direta para partes de uma string, se você tentar modificar uma string deste modo (Programa 6.6), irá obter um erro do interpretador Python:
frase = ‘Romani’
print (frase[-1])
frase[-1] = ‘o’
■ Programa 6.6: Programa com erro de tentativa de
modificação de uma string.
O resultado será:
i
Traceback (most recent call last):
File “imutavel.py”, line 3, in <module> frase[-1] = ‘o’
TypeError: ‘str’ object does not support item assign ment
O que Python está dizendo é que na linha 3 houve um erro. Mais ainda, diz que o objeto ‘str’, que é a string, não suporta a atribuição de um item. Perceba que, para ler o caractere ‘i’ de ‘Romani’, a sintaxe de colchetes é correta, e, como em uma lista, o último elemento de uma string pode ser lido com o índice –1. Mas você pode apenas ler, nunca substituir um elemento de uma string.
Portanto, se você deseja realmente modificar uma string, terá de criar uma string nova a partir da original (Programa 6.7).
frase = ‘Romani’
frase = frase[:-1] + ‘o’
print (frase)
■ Programa 6.7: Programa que cria uma nova string a partir de
outra.
A expressão frase[:-1] toma todos os caracteres de frase até o penúltimo, como no fatiamento de listas. Uma vez que tenha essa fatia de frase, cria uma nova string e a atribui à variável frase, concatenando a fatia obtida ao caractere ‘o’. Veja um esquema da
ação na Figura 6.1.
Figura 6.1 Criação de string por fatiamento.
Veja que a string original, ‘Romani’, virou lixo. Python vai recolher
esse lixo e liberar a área de memória para ser reutilizada pelo mecanismo conhecido como “coletor de lixo” (Veja Seção 2.6.1).
Como as strings são imutáveis, podem ser passadas como
parâmetro para uma função sem risco de serem alteradas. É instrutivo comparar o comportamento de strings e listas quando passadas como parâmetros. Veja o Programa 6.8.
def muda_valor(param):
param += ‘x’
print(‘Dentro da função:’,param)
lista = [‘a’,’b’,’c’]
palavra = ‘abc’
muda_valor(lista)
muda_valor(palavra)
print(lista)
print(palavra)
■ Programa 6.8: Diferença entre passar uma lista ou uma
string como parâmetro de uma função.
O resultado é:
Dentro da função: [‘a’, ‘b’, ‘c’, ‘x’]
Dentro da função: abcx
[‘a’, ‘b’, ‘c’, ‘x’]
abc
Perceba como a lista foi modificada e recebeu o acréscimo do ‘x’
enquanto a string do programa principal permaneceu inalterada.
EXERCÍCIO 6.2
Volte aos capítulos sobre listas e teste quais comandos de listas funcionam em
strings. Substitua nos programas do capítulo as listas por strings, quando couber, e
veja se ocorrem erros de execução.