在嵌套的for循环中声明嵌套对象-Python 3

时间:2018-11-25 01:16:22

标签: python python-3.x list for-loop nested-loops

我是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]

所以我想知道这些都不是从哪里来的?我注意到它们取决于range(n)...就像'for a'循环是否在'for b'循环内重复一样。 另一个问题是输出的第一部分应该是:

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

有人可以帮我吗?谢谢!

3 个答案:

答案 0 :(得分:1)

如果您将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

我想这就是你的追求。请参见以下链接:"Least Astonishment" and the Mutable Default Argument以了解原因。

问题是,当使用当前的Team()初始化程序时,未传递players参数,其默认值为[],而是期望的{{ 1}}坚持每个团队。

每个团队都引用相同的列表,这就是为什么将相同的列表打印两次的原因。

players被打印三遍的原因是因为每次创建一个团队时,都会添加三名球员,但是您内部的None循环只会修改前三名球员的姓名,而不会最后3位玩家保持不变。

答案 1 :(得分:1)

我同意0liveradam8的回答,只是补充一点-如果您想维护构造函数签名,可以尝试以下方法:

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

因此您仍可以在构造函数中指定玩家列表。

答案 2 :(得分:0)

得到None的原因是您没有在函数中返回值。因此,当您运行脚本时,该脚本将被设置为空。这里是一个链接,以进一步研究它。

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

第二个问题的答案是

for a in range(2):

应该是

for a in range(1):

希望这会有所帮助!