【问题标题】:Declaring nested objects in nested for loops - python 3在嵌套 for 循环中声明嵌套对象 - python 3
【发布时间】:2018-11-25 01:16:21
【问题描述】:

我是 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 来自哪里?我注意到它们取决于范围(n)......就像'for a'循环在'for b'循环内重复。 另一个问题是输出的第一部分应该是:

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

有人可以帮我吗?谢谢!

【问题讨论】:

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


【解决方案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 参数没有像您期望的那样以默认值 [] 传递,而是为每个团队保留了 players 的值制作。

每个团队都有对同一个列表的引用,这就是同一个列表被打印两次的原因。

None 被打印 3 次的原因是因为每次创建团队时,都会增加 3 名球员,但您的内部 for 循环仅修改前 3 名球员的姓名,而不会影响最后 3 名球员.

【讨论】:

  • 这很完美,但我在 self.teams.append(Team()) 内部进行了更改,变成了 self.teams.append(Team(player=[]))。感谢您的示例和链接,我了解了所有故事,我发现这个其他链接也很有帮助:effbot.org/zone/default-values.htm
【解决方案2】:

我同意 0liveradam8 的回复并补充一下 - 如果您想维护构造函数签名,您可以试试这个:

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

因此,如果需要,您仍然可以在构造函数中指定玩家列表。

【讨论】:

    【解决方案3】:

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

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

    第二个问题的答案是

    for a in range(2):
    

    应该是这样的

    for a in range(1):
    

    希望这会有所帮助!

    【讨论】:

    • 当然使用 range(1) 一切正常,但问题是我需要添加我想要的团队数量
    猜你喜欢
    • 2020-02-28
    • 2021-11-25
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2020-10-09
    相关资源
    最近更新 更多