Como passar uma variável por referência em Python?

Juliano Faccioni
5 minutos de leitura

Conteúdos do tutorial

Entender como as variáveis são passadas em Python pode ser um pouco complicado, especialmente se você vem de um background em outras linguagens de programação. O conceito de passar uma variável por referência em Python ou por valor é um pouco diferente. Vamos explorar como o Python lida com a passagem de variáveis e como você pode alcançar o efeito de passar por referência.

Mecanismo de Passagem por Atribuição do Python

Em Python, os argumentos são passados por atribuição, o que significa que a função recebe uma referência ao objeto, mas a referência em si é passada por valor. Isso tem duas implicações:

  1. Se você passar um objeto mutável (como uma lista ou um dicionário) para uma função, a função pode alterar o objeto.
  2. Se você passar um objeto imutável (como um inteiro, tupla ou string), você não pode mudar o objeto original ou reatribuir a referência no escopo de chamada.

Exemplo de Objetos Mutáveis: Listas

Vamos olhar um exemplo usando uma lista, que é um tipo mutável:

def tentar_mudar_conteudo_da_lista(a_lista):
    print('recebido', a_lista)
    a_lista.append('quatro')
    print('alterado para', a_lista)

lista_externa = ['um', 'dois', 'três']
print('antes, lista_externa =', lista_externa)
tentar_mudar_conteudo_da_lista(lista_externa)
print('depois, lista_externa =', lista_externa)
Testar

Saída:

antes, lista_externa = ['um', 'dois', 'três']
recebido ['um', 'dois', 'três']
alterado para ['um', 'dois', 'três', 'quatro']
depois, lista_externa = ['um', 'dois', 'três', 'quatro']

Como você pode ver, a função foi capaz de modificar o conteúdo de lista_externa porque listas são mutáveis.

Exemplo de Objetos Imutáveis: Strings

Agora, vamos ver o que acontece com strings, que são imutáveis:

def tentar_mudar_referencia_da_string(a_string):
    print('recebido', a_string)
    a_string = 'Em um reino junto ao mar'
    print('definido como', a_string)

string_externa = 'Era muitos e muitos anos atrás'
print('antes, string_externa =', string_externa)
tentar_mudar_referencia_da_string(string_externa)
print('depois, string_externa =', string_externa)
Testar

Saída:

antes, string_externa = Era muitos e muitos anos atrás
recebido Era muitos e muitos anos atrás
definido como Em um reino junto ao mar
depois, string_externa = Era muitos e muitos anos atrás

A função não pôde alterar a string original porque strings são imutáveis.

Como Simular Passagem por Referência

Se você quiser simular o comportamento de passar uma variável por referência com objetos imutáveis em Python, você pode usar um objeto embrulho como uma lista:

def usar_um_embrulho_para_simular_passagem_por_referencia(coisa_a_mudar):
    coisa_a_mudar[0] = 'Alterado'

embrulho = ['Original']
usar_um_embrulho_para_simular_passagem_por_referencia(embrulho)
print(embrulho[0])  # Saída: Alterado
Testar

Usando uma lista para embrulhar a string, você pode alterar a lista para refletir as mudanças.

Resumo

Em Python, passamos variáveis para funções por atribuição, o que significa que a função recebe uma referência ao objeto, não o próprio objeto em si. Podemos alterar objetos mutáveis dentro da função, afetando o objeto original. Entretanto, não podemos alterar objetos imutáveis, mas você pode simular a passagem por referência usando um objeto embrulho mutável. Entender esses conceitos ajudará você a manipular variáveis em Python de forma mais eficaz.

Inscreva-se gratuitamente e fique atualizado

Receba toda semana um resumo dos principais conteúdos da Asimov direto no seu e-mail. 100% livre de spam.

Áreas de interesse:
Conteúdos do tutorial