0

Python newbie here. I ran into some unexpected behavior using class variables home_team and away_team (See below).

class GameTeam():

    def __init__(self, prev_game=None, prev_result=None, wins=0, losses=0):
        self.prev_game = prev_game
        self.prev_result = prev_result
        self.wins = wins
        self.losses = losses

class Game1():
    home_team = GameTeam()
    away_team = GameTeam()

    def __init__(self, game_num):
        self.game_num = game_num

    def __str__(self):
        return str(self.game_num)

    def __repr__(self):
       return str(self)

game11 = Game1(1)
game12 = Game1(2)

game11.away_team.losses = game11.away_team.losses + 1
game12.away_team.losses = game12.away_team.losses + 1

print(game11.away_team.losses) #Result is 2
print(game12.away_team.losses) #Result is 2

However, if I initialize home_team and away_team in the __init__() method, I get the result I expected

class GameTeam():

    def __init__(self, prev_game=None, prev_result=None, wins=0, losses=0):
        self.prev_game = prev_game
        self.prev_result = prev_result
        self.wins = wins
        self.losses = losses

class Game2():

    def __init__(self, game_num):
        self.game_num = game_num
        self.home_team = GameTeam()
        self.away_team = GameTeam()

    def __str__(self):
        return str(self.game_num)

    def __repr__(self):
       return str(self)

game21 = Game2(1)
game22 = Game2(2)

game21.away_team.losses = game21.away_team.losses + 1
game22.away_team.losses = game22.away_team.losses + 1

print(game21.away_team.losses) #Returns 1
print(game22.away_team.losses) #Returns 1

Can someone explain to me what's going on here or point me to the section of the docs explaining this?

Ben
  • 20,038
  • 30
  • 112
  • 189

1 Answers1

1

Class variables vs. instance variables:

https://docs.python.org/3.4/tutorial/classes.html#class-and-instance-variables

Class variables are shared across all instances of a class. Instance variables are per instance.

Ken Tindell
  • 343
  • 4
  • 7