我是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
...
有人可以帮我吗?谢谢!
答案 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):
希望这会有所帮助!