这可能实际上是一个荒谬的请求,正如我在问过之后我会解释的那样!
我在这样的脚本中加载了一个列表:
{{1}}
我使用set()函数来避免两次计算同一个Property对象(Property是我之前定义的类,它与python自己的'property'关键字无关)。 现在,由于集合是无序的,当我将其转换为列表时,每次加载时,生成的PROPERTIES可能会以不同的顺序出现。
当我访问列表中的对象时,它将读取类似“< ... object at 0x103098550>”的内容,其中0x103098550是加载的对象的内部存储器。
我的问题如下:有没有办法将列表按内存位置的升序排序,这样每次加载时,PROPERTIES的顺序都是相同的?
请注意,NETWORKS的顺序始终相同,没有随机性。唯一可能的随机性是调用set()函数时。
如果使用这行代码本身动态生成位置,这可能是一个愚蠢的问题。
编辑:注意。每次加载它时,我都不是要求内存位置相同(我知道这与我的整台计算机有关,也可能是随机的),但也许订购的内存每次加载时,对象n.properties都是一样的。毕竟,当我构建/加载NETWORKS时,我总是以相同的顺序加载其中的每个网络,并且可能是分配的内存位置将单调下降(或者向上?我不记得堆是如何工作的)。
答案 0 :(得分:4)
依赖于内存位置 - 不保证是单调的(Python运行时处理它自己的内存池并且经常重用已经分配的内存) - 肯定不会以可靠的方式工作(它可以似乎有时工作 - 特别是在快速测试脚本中 - 但你可以认为这是一个意外)。
一个更简单的解决方案(假设您的属性对象是可清除的)将使用具有虚拟值的std::forward
:
Args...
此解决方案 保证可以工作。
答案 1 :(得分:2)
通过id
函数检索任何对象的内存位置。所以你可以这样做:
sorted(PROPERTIES, key=id)