如何在保留ctypes指针引用的前提下正确对指针列表排序?
问题分析
直接对objC(指针列表)调用sorted()会不符合预期,原因是ctypes的pointer对象默认按内存地址比较排序,而非它指向的contents.value值,这和你需要的按目标值排序逻辑不匹配。
解决方案
使用sorted()的key参数,指定排序依据为每个指针指向的contents.value,这样既不会丢失指针引用,也无需额外生成值列表,效率更高:
from ctypes import c_long, pointer class A: def __init__(self): self.arg1 = c_long(1) self.arg2 = c_long(2) self.arg3 = c_long(3) objB = [A() for _ in range(5)] objC = [pointer(_objB.arg3) for _objB in objB] for i in range(5): objC[0].contents.value = i # 用key参数指定按指向的值排序,保留指针引用 objC = sorted(objC, key=lambda p: p.contents.value)
原理说明
sorted()的key参数接受一个函数,该函数会对列表中的每个元素(此处为pointer对象)计算排序键值,排序时基于这个键值比较,而非元素本身。- 这里的
lambda p: p.contents.value提取每个指针指向的c_long对象的value作为排序依据,排序完成后返回的仍是原指针对象组成的列表,完全保留对objB元素的引用。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

