Gregg Martinson wrote: > I have been working through a fairly simple process to teach myself python > and I am running into a problem with a comparison. Can anyone tell me > where I am going wrong? > > #!/usr/bin/env python > > class Team(object): > code = "" > opponents_debated=[] > wins=0 > losses=0 > competitors=[]
Defining the 'competitors' list here means that it is shared by all Team instances. As soon as any team A has debated with a team B B is added to this list. As any team immediately adds itself to the list no debate will ever take place. Solution: instead of a class attribute make the list an instance attribute by moving the definition into the initialiser: > > def __init__(self, code): self.competitors = [] > self.code = code > self.competitors.append(code) > #self.school_teams.append(code) Note that the difference between class and instance attributes exists for all attributes, but may not lead to an error when you rebind instead of mutating the attribute: >>> class T: ... wins = 0 ... def win(self): ... self.wins = self.wins + 1 ... >>> a = T() >>> b = T() >>> a.win() >>> a.win() >>> b.win() >>> a.wins 2 >>> b.wins 1 >>> T.wins 0 That is because the first time win() is called on an instance self.wins = self.wins + 1 The instance attribute is not found and the right side falls back to look up self.wins in the class, i. e. the first time you are effectively running self.wins = T.wins + 1 The left-hand side always denotes an assignment to the instance, so T.wins will always remain 0. It is still good practice to define all attributes that are meant to be instance attributes in the initialiser: class Team: def __init__(self, code): self.wins = 0 self.losses = 0 ... _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor