Объявление вложенных объектов во вложенных циклах - python 3 - PullRequest
0 голосов
/ 25 ноября 2018

Я новичок в фантастическом мире python, и на данный момент я борюсь с этой проблемой ... Вот пример того, что я кодировал:

class League():
    def __init__(self, teams=[]):
        self.teams = teams
    def initLeague(self):
        for a in range(2):
            self.teams.append(Team())
            self.teams[a].name = "Team" + str(a)
            for b in range(3):
                self.teams[a].players.append(Player())
                self.teams[a].players[b].name = "Name-" + str(a) + "-" + str(b)
    def printLeague(self):
        for team in self.teams:
            print(team.name)
            for player in team.players:
                print(player.name)

class Team():
    def __init__(self, name=None, players=[]):
        self.name = name
        self.players = players

class Player():
    def __init__(self, name=None):
        self.name = name

nba = League()
nba.initLeague()
nba.printLeague()

Вывод выглядитвот так:

Team0
Name-1-0
Name-1-1
Name-1-2
None
None
None
Team1
Name-1-0
Name-1-1
Name-1-2
None
None
None
[Finished in 0.051s]

Итак, я хотел бы знать, откуда эти None?Я заметил, что они зависят от range (n) ... это похоже на то, что цикл for for повторяется внутри цикла for b.Другая проблема заключается в том, что первая часть вывода должна быть:

Team0
Name-0-0
Name-0-1
Name-0-2
...

Может ли кто-нибудь мне помочь?Спасибо!

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

Если вы замените свой Team() класс следующим:

class Team():
def __init__(self, name=None):
    self.name = name
    self.players = []

Ваш результат станет таким:

Team0
Name-0-0
Name-0-1
Name-0-2
Team1
Name-1-0
Name-1-1
Name-1-2

, который, я думаю, является тем, к чему вы стремитесь.См. Эту ссылку: «Наименьшее изумление» и изменяемый аргумент по умолчанию , чтобы понять, почему.

Проблема в том, что при использовании текущего инициализатора Team() параметр players не передаетсясо значением по умолчанию [], как вы ожидаете, вместо этого значение players сохраняется для каждой созданной команды.

Каждая команда имеет ссылку на один и тот же список, поэтому один и тот же список печатается дважды.

Причина, по которой None печатается три раза, заключается в том, что каждый раз, когда создается команда,Добавлены еще 3 игрока, но ваш внутренний цикл for изменяет только имена первых 3 игроков, оставляя последних 3 игроков нетронутыми.

0 голосов
/ 25 ноября 2018

Я согласен с ответом 0liveradam8 и просто добавлю - если вы хотите сохранить сигнатуру конструктора, вы можете попробовать это:

class Team():
    def __init__(self, name=None, players=None):
        if players is None:
            players = []
        self.name = name
        self.players = players

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

0 голосов
/ 25 ноября 2018

Причина, по которой вы получаете None, заключается в том, что вы не вернули значение в функциях.Поэтому, когда вы запускаете ваш скрипт, он устанавливается в ничто.Вот ссылка, чтобы посмотреть в нее больше.

http://interactivepython.org/runestone/static/pip2/Functions/Returningavaluefromafunction.html

Ответ на ваш второй вопрос таков:

for a in range(2):

должно быть похоже на

for a in range(1):

Надеюсь, это поможет!

...