Introdução à programação e aos algoritmos
4.5.1 Passagem por Valor ou Referência? Nenhuma das Duas
Linha 10. Quando a função foo() termina a execução, o
endereço de retorno é pego na pilha e o fluxo volta à linha seguinte. Toda a parte da pilha que tinha sido alocada para executar a função foo() é liberada, e o fluxo do programa continua.
EXERCÍCIO 4.14
Faça um desenho com a evolução da pilha, nos moldes da versão simpli cada da
Figura 4.9, para a execução do Programa 4.16.
4.5.1 PASSAGEM POR VALOR OU REFERÊNCIA? NENHUMA
DAS DUAS
Em Computação temos várias formas de passagem de parâmetros: valor, referência, valor-referência, resultado, nome, e o que mais se imagine. Ao longo do tempo, duas formas se estabeleceram como mais usadas: por valor e por referência.
Olhemos o Programa 4.18.
1 def foo(num):
2 num = 0
3
4 n = 42
5 foo(n)
6 print(‘n =’, n)
■ Programa 4.18: Passagem de parâmetros.
Resumindo as duas formas: na passagem por valor, é feita uma
cópia da variável para a função. Deste modo, qualquer alteração feita dentro da função não afeta a variável original. Se o Programa 4.18 usasse passagem por valor, seu comportamento seria o da
Figura 4.10.
Figura 4.10 Passagem de parâmetros por valor.
Na passagem por referência, é passada uma referência à variável original e tudo o que se faz dentro da função afeta essa
variável. Para o nosso programa, seria como na Figura 4.11.
Figura 4.11 Passagem de parâmetros por referência.
Como vimos, Python passa uma referência, mas, no exemplo, quando é feita uma modificação na variável da função, essa linguagem cria uma nova referência para ela. Isto leva alguns autores a dizerem que Python passa parâmetros por valor e outros que passa por referência. Uma terceira via diz que Python passa por
valor-objeto. Que confusão! (Figura 4.12)
A forma pela qual Python vai tratar o parâmetro é mais ligada ao fato de a variável ser mutável ou imutável. Um inteiro é um objeto imutável e, portanto, não é possível usar a referência para modificar o valor original usado na chamada. Quando virmos objetos mutáveis, Python vai passar a se comportar mais como se fizesse a passagem por referência.