3
respostas

[Dúvida] Exercício 5 - Erro ao executar função

Olá!

Estou tendo dúvidas a respeito deste erro quando tentei rodar o meu código na atividade 5. Quando vou rodar o código, aperece o erro "UnboundLocalError: local variable 'media' referenced before assignment". Por que este erro acontece, sendo que eu ja declarei a variável 'media' como variável global antes de declarar a função?

Eu sei que a melhor solução para o problema não é esta, mas gostaria de entender um pouco mais sobre o erro que ocorreu no meu código.

notas = []

for i in range(1,6):
  nota = float(input(f'Insira a {i}ª nota: '))
  notas.append(nota)

media = 0

def nota_manobra(lista: list) -> float:
  lista.remove(min(lista))
  lista.remove(max(lista))
  for i in lista:
    media += i
  media /= 3
  return media

media = nota_manobra(notas)
print(f'Nota da manobra: {media}')
3 respostas

Oi, Gustavo


notas = []

for i in range(1,6):
  nota = float(input(f'Insira a {i}ª nota: '))
  notas.append(nota)

def nota_manobra(lista: list) -> float:
  media = 0
  lista.remove(min(lista))
  lista.remove(max(lista))
  for i in lista:
    media += i
  media /= 3
  return media

media_final = nota_manobra(notas)
print(f'Nota da manobra: {media_final}')

Global


notas = []

for i in range(1,6):
  nota = float(input(f'Insira a {i}ª nota: '))
  notas.append(nota)

media = 0

def nota_manobra(lista: list) -> float:
  global media
  lista.remove(min(lista))
  lista.remove(max(lista))
  for i in lista:
    media += i
  media /= 3
  return media

media_final = nota_manobra(notas)
print(f'Nota da manobra: {media_final}')

Boa tarde, Luis!

Obrigado pela resposta. Ainda continuo sem entender o erro que ocorreu, pois quando eu rodo o código abaixo nenhum erro é exibido. Ou seja, eu declarei as variáveis 'distancias' e 'passeio', por ex., antes da função, utilizei-a dentro dela sem chamar a built-in function 'global' e o código rodou sem o erro "UnboundLocalError: local variable 'media' referenced before assignment" anteriormente referenciado. Estou tentando entender por que esse erro ocorreu no meu código anterior.

Segue o código novo, ao qual faço referência (ele é a solução do exercício 9 deste módulo:

dias = int(input("Quantas diárias? "))
cidade = input("Qual a cidade? [Salvador, Fortaleza, Natal ou Aracaju]: ")
distancias = [850, 800, 300, 550]
passeio = [200, 400, 250, 300]
km_l = 14
gasolina = 5

def gasto_hotel(dias):
    return 150 * dias

def gasto_gasolina(cidade):
    if cidade == "Salvador":
        return (2 * distancias[0] * gasolina) / km_l 
    elif cidade == "Fortaleza":
        return (2 * distancias[1] * gasolina) / km_l 
    elif cidade == "Natal":
        return (2 * distancias[2] * gasolina) / km_l 
    elif cidade == "Aracaju":
        return (2 * distancias[3] * gasolina) / km_l 

def gasto_passeio(cidade, dias):
    if cidade=="Salvador":
        return passeio[0] * dias
    elif cidade=="Fortaleza":
        return passeio[1] * dias
    elif cidade=="Natal":
        return passeio[2] * dias 
    elif cidade=="Aracaju":
        return passeio[3] * dias 

gastos = gasto_hotel(dias) + gasto_gasolina(cidade) + gasto_passeio(cidade, dias)
print(f"Com base nos gastos definidos, uma viagem de {dias} dias para {cidade} saindo de Recife custaria {round(gastos, 2)} reais")

Gustavo

Veja a diferença

gasolina = 5

def novaGasolina():
  gasolina = 6 # essa é uma nova variável que só vale dentro deste bloco
  print(gasolina)
  
def valorGasolina():
  print(gasolina)     

novaGasolina() # saída 6
valorGasolina() # saída 5

gasolina = 5

def novaGasolina():
  global gasolina    
  gasolina = 6      # essa é uma variável global
  print(gasolina)
  
def valorGasolina():
  print(gasolina)     

novaGasolina() # saída 6
valorGasolina() # saída 6

O problema


def nota_manobra(lista: list) -> float:
  lista.remove(min(lista))
  lista.remove(max(lista))
  for i in lista:
    media += i              # é uma nova varável que ainda não tem valor e está tentando somar "i"
  media /= 3
  return media