我可以按内存位置对 python 中的列表元素进行排序(排序)吗?



这实际上可能是一个荒谬的请求,正如我问完之后我会解释的那样!

我在这样的脚本中加载了一个列表:

PROPERTIES = list(set().union(*[n.properties for n in NETWORKS]))  # random order

我使用 set() 函数来避免两次计算同一个属性对象(属性是我之前定义的一个类,它与 python 自己的"属性"关键字无关)。 现在,由于集合是无序的,当我将其转换为列表时,每次加载它时,生成的 PROPERTIES 可能会以不同的顺序出现。

当我访问列表中的对象时,它会读到类似"<...对象位于 0x103098550>",其中0x103098550是加载对象的内部存储器。

我的问题是:有没有办法将列表按内存位置的升序排序,以便每次加载时属性的顺序都相同?

请注意,NETWORKS 的顺序始终相同,那里没有随机性。唯一可能的随机性是调用 set() 函数时。

如果位置是用这行代码本身动态生成的,这可能是一个愚蠢的问题。

编辑:注意。我并不是要求每次加载时内存位置都相同(我知道这与我的整个计算机有关,也可能是随机的),但也许每次加载对象 n.properties 的内存顺序都是相同的。毕竟,当我构建/加载 NETWORKS 时,我总是以相同的顺序在其中加载每个网络,并且可能分配的内存位置将单调下降(或向上?我不记得堆是如何工作的)。

依赖内存位置 - 不能保证单调(Python 运行时处理它自己的内存池,并且经常重用已经分配的内存) - 肯定不会以可靠的方式工作(它有时似乎可以工作 - 特别是在快速测试脚本中 - 但你可以认为这是一个意外)。

更简单的解决方案(假设属性对象是可哈希的)是使用具有虚拟值的collections.OrderedDict

from collections import OrderedDict
PROPERTIES = list(OrderedDict(n.properties, None) for n in NETWORKS))

此解决方案可确保正常工作。

任何对象的内存位置都通过id函数检索。所以你可以这样做:

sorted(PROPERTIES, key=id)

最新更新