passerby 0 Denunciar post Postado Abril 13, 2009 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
Tarantula 0 Denunciar post Postado Maio 22, 2009 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