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

Python中TypeError: 'Students'对象不可下标访问问题修复及解析

问题解决:TypeError: 'Students' object is not subscriptable

错误原因

  1. 排序方法误用:你用了operator.itemgetter(0),这个函数是给列表、元组这类可下标访问的序列用的,用来取对应下标的元素。但你的列表里存的是自定义Students类的对象,对象不能用[0]这种下标方式访问属性,所以触发了not subscriptable错误。
  2. 输入类型未处理:年龄和身高输入后默认是字符串类型,直接按字符串排序会出现不符合预期的结果(比如"9"会排在"18"后面)。
  3. 排序函数无返回值:std.sort()是原地排序方法,不会返回新列表,所以students_new = sort_list(students)会得到None,后续调用print_students_info(None)会引发新错误。

修正后的完整代码

import operator
from operator import attrgetter

class Students:
    def __init__(self, name, age, height):
        self.name = name
        self.age = age
        self.height = height

def input_student_info():
    name = input("Enter student name: ")
    # 转换年龄为整数,确保数值排序正确
    age = int(input("Enter student age: "))
    # 转换身高为浮点数,支持小数身高的排序
    height = float(input("Enter student height: "))
    student = Students(name, age, height)
    return student

def print_student_info(student):
    print(f"Student name: {student.name}")
    print(f"Student age: {student.age}")
    print(f"Student height: {student.height:.1f}")

def input_students_info():
    std = []
    total_students = int(input("How many student: "))
    for i in range(total_students):
        print(f"Student {i+1}:")
        stu = input_student_info()
        std.append(stu)     
    return std

def print_students_info(std):
    for idx, student in enumerate(std, 1):
        print(f"Student {idx}:")
        print_student_info(student)

def sort_list(std):
    # 使用attrgetter按姓名→年龄→身高的优先级排序
    std.sort(key=attrgetter('name', 'age', 'height'))
    # 返回排序后的列表,避免返回None
    return std

def main():
    students = input_students_info()
    input("Press Enter to continue")
    students_new = sort_list(students)
    print_students_info(students_new)

main()

关键修正点说明

  • 替换排序键:把itemgetter(0)换成attrgetter('name', 'age', 'height'),attrgetter专门用来获取自定义对象的属性值,支持多属性的优先级排序,完全匹配你的需求。
  • 输入类型转换:将年龄转为int、身高转为float,确保数值排序的逻辑正确。
  • 修复返回值问题:在sort_list函数中添加return std,解决原代码中students_new为None的问题。
  • 优化代码格式:用f-string简化字符串拼接,让代码更易读;用enumerate简化循环计数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:10:44