You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中使用列表推导式打印Fist对象失败,求问题排查与解决

问题:打印Player的fists时显示对象地址而非预期内容

问题现象

打印玩家的fists属性时,输出的是对象内存地址:

[<__main__.Fist object at 0x7f3d73f7e280>, <__main__.Fist object at 0x7f3d73f7e3a0>]
[<__main__.Fist object at 0x7f3d73f7e490>, <__main__.Fist object at 0x7f3d73f7e4f0>]

代码问题分析与修复

1. Fist类缺少__repr__方法

直接打印列表时,Python会调用列表内每个元素的__repr__方法,而非__str__。你只重写了__str__,所以列表打印仍显示对象地址。需要给Fist类添加__repr__方法,或者让__repr__复用__str__的逻辑。

2. Player类__str__方法拼写错误

方法内的self.fist应为self.fists(少了末尾的s),否则调用时会抛出AttributeError。

3. Player类check_fist_count方法逻辑错误

判断self.fists == 0是错误的,因为self.fists是列表,应该检查其长度len(self.fists) == 0。

4. Player类__init__方法缩进错误

创建fists的循环缩进不在__init__方法内部,导致代码无法正确初始化玩家的fists属性,还会引发NameError。


修复后的完整代码

class Fist:
    Labels = ['Left', 'Right']

    def __init__(self, label):
        self.label = label

    # 重写__str__用于直接打印对象时的输出
    def __str__(self):
        return f"{self.label}"

    # 重写__repr__,让列表打印时也显示友好内容
    def __repr__(self):
        return self.__str__()


class Player:
    def __init__(self, name):
        self.name = name
        self.fists = []

        # 初始化玩家的两只拳头,缩进修正到__init__内部
        for label in Fist.Labels:
            self.fists.append(Fist(label))

    def check_fist_count(self):
        # 修正判断逻辑:检查列表长度
        if len(self.fists) == 0:
            print(f'{self.name} fist count is now zero. They now are out of the game!')

    def __str__(self):
        # 修正拼写错误:self.fist → self.fists
        return f"{self.name}: {' '.join([str(fist) for fist in self.fists])}"


if __name__ == '__main__':
    numberOfPlayers = int(input("Bubblegum Nursery Rhyme Game: How many players will be playing this game?"))
    
    if numberOfPlayers <= 1 :
        print('Sorry, you can only play this game if you have a minimum of 2 players.')
    else:
        # 只有玩家数合法时才创建玩家
        game_players = []
        for i in range(numberOfPlayers):
            game_players.append(Player(f'Player {i+1}'))  # 玩家编号从1开始更符合习惯

        # 测试打印
        for game_player in game_players:
            print(game_player.fists)  # 现在会显示['Left', 'Right']
            print(game_player)  # 使用Player的__str__方法打印

修复后的输出示例

[Left, Right]
Player 1: Left Right
[Left, Right]
Player 2: Left Right

内容的提问来源于stack exchange,提问作者zee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:17:54