Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

passerby

Comportamento de variáveis locais

Recommended Posts

Olá,

eu estou tendo problemas com o comportamento das variáveis locais numa função, que se comportam como variáveis globais. Eu tenho o seguinte método que é recursivo:

 

def buscaEmProfundidadeMenorCaminho(self, origem, destino, visitados = [] , caminho = [], valor = 0, todosCaminhos = {} ):

print "VISITADOS!!!! ",

print visitados

.............

 

então eu chamo o método duas vezes:

 

self.assertEqual(g.buscaEmProfundidadeMenorCaminho("A", "D"),caminho)

self.assertEqual(g.buscaEmProfundidadeMenorCaminho("A", "F"),None)

 

na primeira vez ele roda direitinho, e na primeira chamada o visitados aparece vazio, como deveria

mas quando roda a segunda vez, quando eu tenho a origem como A e o destino como F, já na primeira chamada desse método, a lista de visitados vem com os valores da primeira vez (aquela que eu passei os valores como A e D). Ou seja, me parece que a lista de visitados se comporta como se fosse global, a segunda vez que eu chamo o método, ele n cria uma lista vazia, como eu peço (visitados = [] )

Eu não sei se eu me expliquei bem, mas será que alguém sabe como eu posso evitar isso?? Como que eu faço pra ele não preservar o conteúdo das listas quando eu chamo o método e não passo esses parâmetros.

Obrigada desde já

Compartilhar este post


Link para o post
Compartilhar em outros sites

O argumento default é instanciado apenas uma vez só, no caso ele irá criar apenas uma vez a lista, não é como se fosse global, você está usando a mesma lista criada no argumento default nas chamadas subsequentes, você deveria fazer:

 

def buscaEmProfundidadeMenorCaminho(self, origem, destino, visitados=None, caminho = [], valor = 0, todosCaminhos = {} ):
	# Faça isto para os outros parametros também
	if visitados is None:
		visitados = []

	print "VISITADOS!!!! ",
	print visitados

Python não é Java, o nome da função está fora do padrão, o certo seria: busca_em_profundidade_menor_caminho, ou abreviado.

 

Espero ter ajudado !

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.