在嵌套 for 循环中声明嵌套对象 - python 3
Declaring nested objects in nested for loops - 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]
所以我想知道这些None是从哪里来的?我注意到它们依赖于 range(n)... 这就像 'for a' 循环在 'for b' 循环中重复一样。
另一个问题是输出的第一部分应该是:
Team0
Name-0-0
Name-0-1
Name-0-2
...
有人可以帮助我吗?谢谢!
您得到 None 的原因是您没有在函数中返回值。因此,当您 运行 您的脚本时,它被设置为空。这里有一个 link 来进一步研究它。
http://interactivepython.org/runestone/static/pip2/Functions/Returningavaluefromafunction.html
第二个问题的答案是
for a in range(2):
应该是
for a in range(1):
希望对您有所帮助!
如果您将 Team()
class 替换为:
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
我认为这就是您所追求的。请参阅此 link:"Least Astonishment" and the Mutable Default Argument 了解原因。
问题是,当使用您当前的 Team()
初始化程序时,players
参数没有像您期望的那样以默认值 []
传递,而是players
为每支队伍保留。
每个团队都有对同一个列表的引用,这就是同一个列表被打印两次的原因。
之所以打印3次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
因此您仍然可以在必要时在构造函数中指定玩家列表。
我是 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 a' 循环在 'for b' 循环中重复一样。 另一个问题是输出的第一部分应该是:
Team0
Name-0-0
Name-0-1
Name-0-2
...
有人可以帮助我吗?谢谢!
您得到 None 的原因是您没有在函数中返回值。因此,当您 运行 您的脚本时,它被设置为空。这里有一个 link 来进一步研究它。
http://interactivepython.org/runestone/static/pip2/Functions/Returningavaluefromafunction.html
第二个问题的答案是
for a in range(2):
应该是
for a in range(1):
希望对您有所帮助!
如果您将 Team()
class 替换为:
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
我认为这就是您所追求的。请参阅此 link:"Least Astonishment" and the Mutable Default Argument 了解原因。
问题是,当使用您当前的 Team()
初始化程序时,players
参数没有像您期望的那样以默认值 []
传递,而是players
为每支队伍保留。
每个团队都有对同一个列表的引用,这就是同一个列表被打印两次的原因。
之所以打印3次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
因此您仍然可以在必要时在构造函数中指定玩家列表。