You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 09:48:16