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

按属性排序对象列表返回内存地址,元组列表排序问题问询

问题分析与解决方案

我明白你困惑的点了——你看到的“内存地址”其实不是排序返回的结果有问题,而是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:22:28