Python добавляется к двум спискам, когда он должен добавлять только к одному - PullRequest
0 голосов
/ 28 июля 2011

У меня есть список команд, который содержит два объекта, это объекты одного класса, и у них обоих есть список «членов». Я добавляю в эти списки индивидуально. См. Fight.AddParticipant, но два объекта участника, которые я добавляю, похоже, оказываются в обоих объектах команды, что является непреднамеренным поведением. Почему это происходит?

Код:

class Fight:
    participants = []
    teams = []
    attacked = []
    fighting = 0

    def MakeTeams(self, team):
        self.teams.append(team)

    def NumParticipants(self, teamnum = None):
        if (teamnum != None):
            return len(self.teams[teamnum].members)
        else:
            return len(self.participants)


    def AddParticipant(self, participant, team):
        self.participants.append(participant)
        ref = self.participants[-1]
        self.teams[team].members.append(ref)
        # print self.teams[1].members[0].name

    def SetFighting(self):
        self.fighting = self.NumParticipants()

    def AnnounceFight(self):
        print 'A battle between', self.NumParticipants(), 'fighters has begun!\n\n'
        self.AnnounceTeams()

    def AnnounceTeams(self):
        print ''
        for team in self.teams:
            print "Team name:", team.name
            print "Team morale:", team.morale
            for member in team.members:
                print member.name


class Participant:
    name = ""
    race = ""
    sex = ""
    hp = 0
    strength = 0
    agility = 0
    weapon = ""
    alive = True

    def __init__(self, name, race, sex, hp, strength, agility, weapon, alive = True):
        self.name = name
        self.race = race
        self.sex = sex
        self.hp = hp
        self.strength = strength
        self.agility = agility
        self.weapon = weapon
        self.alive = alive


class Team:
    name = ""
    members = []
    morale = 0

    def __init__(self, name, morale):
        self.name = name
        self.morale = morale

Fight = Fight()
Fight.MakeTeams(Team('Smart', 1))
Fight.MakeTeams(Team('Dumb', 1))
Fight.AddParticipant(Participant("Foo", "Human", "Female", 15, 15, 20, "Knife"), 0)
Fight.AddParticipant(Participant("Bar", "Human", "Male", 15, 15, 20, "Sabre"), 1)
Fight.SetFighting()
Fight.AnnounceFight()

Ответы [ 3 ]

3 голосов
/ 28 июля 2011

Во всех ваших классах вы хотите инициализировать переменные экземпляра следующим образом:

def __init__(self):
    self.participants = []
    self.teams = []
    self.attacked = []
    self.fighting = 0

Таким образом, они являются отдельными для каждого боя, участника, команды вместо общих для всех боев, участников иликоманды.

3 голосов
/ 28 июля 2011

Вы создали списки как атрибуты класса, что означает, что списки являются общими для всех экземпляров. Это тот же список. Вы должны сделать атрибуты экземпляра списков. Сделайте это, создав их в методе класса __init__ (конструктор).

0 голосов
/ 28 июля 2011

Я думаю, что вы подразумеваете, что члены являются членами экземпляра, но вместо этого делаете их членами класса.Попробуйте это:

class Team:
    name = ""
    morale = 0

    def __init__(self, name, morale):
        self.members = []
        self.name = name
        self.morale = morale

Возможно, вы захотите переместить все остальные переменные в конструкторы, а не хранить их как переменные класса.Переменные класса являются общими для всех экземпляров и принадлежат классу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...