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

时间:2018-01-29 11:59:17

标签: python python-3.x list sorting memory

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

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

{{1}}

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

当我访问列表中的对象时,它将读取类似“< ... object at 0x103098550>”的内容,其中0x103098550是加载的对象的内部存储器。

我的问题如下:有没有办法将列表按内存位置的升序排序,这样每次加载时,PROPERTIES的顺序都是相同的?

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

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

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

2 个答案:

答案 0 :(得分:4)

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

一个更简单的解决方案(假设您的属性对象是可清除的)将使用具有虚拟值的std::forward

Args...

此解决方案 保证可以工作。

答案 1 :(得分:2)

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

sorted(PROPERTIES, key=id)