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



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

所以我想知道这些"无"是从哪里来的?我注意到它们取决于范围(n(。。。这就像"for a"循环在"for b"循环中重复一样。另一个问题是输出的第一部分应该是:

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

有人能帮我吗?非常感谢。

如果将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名球员。

我同意0liveradam8的回应,只是想补充一点——如果你想维护构造函数签名,你可以试试这个:

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

因此,如果需要,您仍然可以在构造函数中指定一个参与者列表。

得到None的原因是您没有在函数中返回值。因此,当您运行脚本时,它被设置为"无"。这里有一个链接可以查看更多信息。

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

你的第二个问题的答案是

for a in range(2):

应该像一样

for a in range(1):

希望这能有所帮助!

最新更新