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

Python中如何打印列表内对象的实际值而非内存地址?

问题解决:打印Grade对象列表显示内存地址而非分数值

问题原因

你遇到的问题出在两个关键点:

  1. 错误的__str__实现:你写的__str__方法返回str(self.grades),但Grade实例并没有grades属性(该属性属于Student类),这个方法根本无法正确返回分数值。
  2. 列表打印的机制:当打印列表(比如pieter.grades)时,Python会对列表中的每个元素调用__repr__方法而非__str__。即便__str__写对了,只要__repr__没有正确实现,列表仍会显示默认的对象内存地址。

解决方案

正确实现Grade类的__repr__方法,让它返回分数的字符串表示即可。如果需要单独打印Grade实例时也显示分数,可同时实现__str__(两者可复用逻辑)。

修正后的代码

class Student:
    def __init__(self, name, year):
        self.name = name
        self.year = year
        self.grades = []
    
    def add_grade(self, grade):
        if isinstance(grade, Grade): 
            self.grades.append(grade)
           
roger = Student("Roger van der Weyden", 10) 
sandro = Student("Sandro Botticelli", 12)
pieter = Student("Pieter Bruegel the Elder", 8)        

class Grade:
    minimum_passing = 65
    
    def __init__(self, score):
        self.score = score
    
    def is_passing(self):
        if self.score >= self.minimum_passing:
            print("Passing")
        else:
            print("Failing")
    
    def __repr__(self):
        # 返回分数的字符串形式,让列表打印时直接显示分数
        return str(self.score)
    
    # 可选:实现__str__,单独打印Grade实例时也显示分数
    def __str__(self):
        return str(self.score)
            
pieter.add_grade(Grade(100))
pieter.add_grade(Grade(89))

pieter_result = Grade(55)
pieter_result.is_passing()
print(pieter.grades)  # 现在会输出 [100, 89]

额外说明

  • isinstance(grade, Grade)比type(grade) is Grade更灵活,支持继承场景,你的这个修改是正确的。
  • 如果只需要列表打印显示分数,仅实现__repr__就足够;如果需要单独打印Grade实例(比如print(Grade(100)))也显示分数,再加上__str__方法即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 22:49:49