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?
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!!
Hahahaha esse erro é clássico