Introdução à programação e aos algoritmos

João Araujo Ribeiro · Capítulo 56 de 103

Páginas do PDF

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.