Python中TypeError: 'Students'对象不可下标访问问题修复及解析
问题解决:TypeError: 'Students' object is not subscriptable
错误原因
- 排序方法误用:你用了
operator.itemgetter(0),这个函数是给列表、元组这类可下标访问的序列用的,用来取对应下标的元素。但你的列表里存的是自定义Students类的对象,对象不能用[0]这种下标方式访问属性,所以触发了not subscriptable错误。 - 输入类型未处理:年龄和身高输入后默认是字符串类型,直接按字符串排序会出现不符合预期的结果(比如"9"会排在"18"后面)。
- 排序函数无返回值:
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
相关产品推荐
相关产品推荐

