能否按内存地址对Python列表元素排序以固定加载顺序?
按内存地址排序实现固定顺序的去重列表
当然可以实现!你想要让PROPERTIES列表每次加载都保持一致顺序的需求,完全可以通过按对象内存地址升序排序来解决,具体做法很简单:
解决方案代码
把你原来的代码修改为:
# 先合并去重,再按对象内存地址升序排序 unique_properties = set().union(*[n.properties for n in NETWORKS]) PROPERTIES = sorted(unique_properties, key=lambda x: id(x))
或者更简洁的一行写法:
PROPERTIES = sorted(set().union(*[n.properties for n in NETWORKS]), key=lambda x: id(x))
原理说明
id()函数的作用:Python的id()函数会返回对象的唯一整数标识符,这个值对应你看到的内存地址(比如0x103098550就是这个整数的十六进制表示)。- 为什么顺序会固定:你提到
NETWORKS的加载顺序始终固定,这意味着所有Property对象的创建顺序是稳定的——而Python中(默认情况下)对象的内存分配通常是单调递增的,先创建的对象id值更小。因此按id(x)升序排序后,列表的顺序会和对象的创建顺序对应,每次加载的结果自然一致。
额外提示
如果你的Property类本身有更适合作为排序依据的属性(比如name、code这类业务字段),用这些字段排序会更直观且可读性更强。但如果没有这类字段,用id()是完全可靠的方案,它能保证同一次运行中排序稳定,且因为NETWORKS加载顺序固定,不同次加载的排序逻辑也会得到一致的结果。
内容的提问来源于stack exchange,提问作者Gregory Fenn
相关产品推荐
相关产品推荐

