Error "Indexerror: list assignment index out of range" when setting "l[0] ="

Asked

Viewed 971 times

2

I’m having a problem in my class in function __init__()

class Lutador():
    __nome = "null"
    __nacionalidade = 'null'
    __idade = 0
    __altura = 0.0
    __peso = 0.0
    __categoria = 'null'
    __vitorias = 0
    __derrostas = 0
    __empates = 0

    #Métodos Especias

    def __init__(self,no,na,ida,al,pe,vi,de,em):
        self.__nome = no
        self.__nacionalidade = na
        self.__idade = ida
        self.__altura = al
        self.setPeso(pe)
        self.__vitorias = vi
        self.__derrotas = de
        self.__empates = em


    def getNome(self):
        return self.__nome

    def setNome(self,nome):
        self.__nome = nome

    def getNacionalidade(self):
        return self.__nacionalidade

    def setNacionalidade(self,nacionalidade):
        self.__nacionalidade = nacionalidade

    def getIdade(self):
        return self.__idade

    def setIdade(self,idade):
        self.__idade = idade

    def getAltura(self):
        return self.__altura

    def setAltura(self,altura):
        self.__altura = altura

    def getPeso(self):
        return self.__peso

    def setPeso(self,peso):
        self.__peso = peso
        self.setCategoria()

    def getCategoria(self):
        return self.__categoria

    def setCategoria(self):
        if (self.__peso<52.2):
            self.__categoria = "Inválido"
        elif (self.__peso<=70.3):
            self.__categoria = "Leve"
        elif (self.__peso<=83.9):
            self.__categoria = "Médio"
        elif (self.__peso<=120.2):
            self.__categoria = "Pesado"
        else:
            self.__categoria = "Inválido"

    def getVitorias(self):
        return self.__vitorias

    def setVitorias(self,vitorias):
        self.__vitorias = vitorias

    def getDerrostas(self):
        return self.__derrostas

    def setDerrostas(self,derrostas):
        self.__derrostas = derrostas

    def getEmpates(self):
        return self.__empates

    def setEmpates(self,empates):
        self.__empates = empates

    #Métodos

    def apresentar():
        print("-----------------------------------------")
        print(f"CHEGOU A HORA! Apresentamos o lutador {self.getNome()}")
        print(f"Diretamente de {self.getNacionalidade()}")
        print(f"Com {self.getIdade()} anos {self.getAltura()}m")
        print(f"Pesando {self.getPeso()} kg")
        print(f"{self.getVitorias()} vitorias")
        print(f"{self.getDerrotas()} derrotas")
        print(f"{self.getEmpates()} empates")

    def status():
        print(f"{self.getNome()} é um peso {self.getCategoria()}")
        print(f"Ganhou {self.getVitorias()} vezes")
        print(f"Perdeu {self.getDerrotas()} vezes")
        print(f"Empatou {self.getEmpates()} vezes")

    def ganharLuta():
        self.setVitorias(self.getVitorias() + 1)

    def perderLuta():
        self.setDerrotas(self.getDerrotas() + 1)

    def empatarLuta():
        self.setEmpates(self.getEmpates() + 1)

# Programa principal

l = []
l[0] = Lutador("Pretty Boy", "França", 31, 1.75, 68.9, 11, 2, 1)

When I run it gives an error:

Traceback (most recent call last):
  File "/home/fbcode/PooPython/07/UltraEmojiCombat.py", line 5, in <module>
    l[0] = Lutador("Pretty Boy", "França", 31, 1.75, 68.9, 11, 2, 1)
IndexError: list assignment index out of range

What I must do?

Thank you for your attention

1 answer

3


You’re doing an assignment in a position that doesn’t exist on the list. As you started the list as empty, there will be no position 0 and therefore you will not be able to do the assignment.

If the idea is to add an element to the list, use the method append:

l.append(Lutador("Pretty Boy", "França", 31, 1.75, 68.9, 11, 2, 1))

If you want to add more than one element at a time, you can use the operator +, as commented in this reply:

Other points that can be considered in your code:

  • In Python there is no custom to define getters and setters as it did, quite common in other languages. In your case, as there is almost no business rule in your methods, you can define your fields as "public";

  • For fields that require certain business rules, you can define a property;

Browser other questions tagged

You are not signed in. Login or sign up in order to post.