Início > Python > Python: valor ou referência?

Python: valor ou referência?

Depois de um longo período sem escrever nada, volto para falar sobre um assunto que sempre me intrigou um pouco no Python: objetos são passados por valor ou por referência?

Um código vale mais do que mil palavras, então acompanhem comigo:

>>> tabela = [[0, 0], [0, 0], [0, 0]]
>>> segunda_linha = tabela[1]
>>> segunda_linha[0] = 1
>>> tabela
[[0, 0], [1, 0], [0, 0]]

Ah, a beleza dos objetos sendo passados por referência! O segunda_linha é uma referência ao segundo elemento da lista tabela, portanto ao alterá-lo, estamos, na verdade, alterando a própria lista original. Quantas possibilidades! Sejamos, então, mais ousados:

 >>> tabela = [[0, 0], [0, 0], [0, 0]]
 >>> primeira_celula_da_segunda_linha = tabela[1][0]
 >>> primeira_celula_da_segunda_linha = 1
 >>> tabela
 [[0, 0], [0, 0], [0, 0]]
 

Êpa! Não funcionou! O que aconteceu?!

O problema neste caso não está na forma como o objeto está sendo passado. Na verdade, o que leva a esse comportamento é o método de atribuição do Python.

Ao invés de alterar tabela, “primeira_celula_da_segunda_linha = 1″ está reatribuindo a variável primeira_celula_da_segunda_linha ao objeto 1. Deste modo, não há como esperar que a lista original seja alterada. Simples, não?

Tags:
  1. Danilo
    11/01/2010 às 21:41 | #1

    Qualquer dia eu vou te dar uma petição pra ler, e tu vai ver o que é bom!
    Desnecessário dizer que eu boiei 100%, mas dou o maior apoio. Python é legal mesmo. Gostei muito do Em Busca do Cálice Sagrado!!

  2. Ygor
    18/01/2010 às 09:32 | #2

    Hahahaha esse erro é clássico

  1. Nenhum trackbacks ainda.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.