按属性排序对象列表返回内存地址,元组列表排序问题问询
问题分析与解决方案
我明白你困惑的点了——你看到的“内存地址”其实不是排序返回的结果有问题,而是Python自定义对象默认的打印格式在搞鬼!先帮你拆解清楚:
为什么会看到“内存地址”?
你定义的s类没有重写__repr__或__str__方法,所以当你打印这个类的实例时,Python会默认输出它的类名和内存地址(比如<__main__.s object at 0x102345678>)。但这不代表排序逻辑错了,只是你看不到背后的属性值而已。
先验证排序是否真的正确
假设你的完整代码是创建了元组列表然后排序,比如:
class s(object): def __init__(self, name): self._name = name def get_name(self): return self._name def val(x): #替代lambda使用 return x[0]._name e1 = s("Fred") e2 = s("Bill") tuple_list = [(e1, 1), (e2, 2)] sorted_list = sorted(tuple_list, key=val) # 别直接打印列表,试试逐个取出属性 for item in sorted_list: print(f"名字: {item[0].get_name()}, 对应值: {item[1]}")
运行这段代码,你会看到输出是:
名字: Bill, 对应值: 2 名字: Fred, 对应值: 1
这说明排序完全符合你的预期——按name属性的字母顺序排好了!
让打印结果直观显示名字
如果想直接打印列表就能看到名字,只需要给s类加一个__repr__方法,自定义对象的打印格式:
class s(object): def __init__(self, name): self._name = name def get_name(self): return self._name # 新增这个方法 def __repr__(self): return f"s({self._name!r})"
现在再打印排序后的列表:
print(sorted_list)
输出就会变成:
[(s('Bill'), 2), (s('Fred'), 1)]
一目了然,再也看不到恼人的内存地址啦!
小优化:用方法而非直接访问私有属性
你的val函数里直接访问了_name,虽然能运行,但_name是约定俗成的私有属性,更规范的做法是用你定义的get_name()方法:
def val(x): return x[0].get_name() # 或者用lambda更简洁: sorted_list = sorted(tuple_list, key=lambda x: x[0].get_name())
内容的提问来源于stack exchange,提问作者Jenna
相关产品推荐
相关产品推荐

