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

Python2.7类深拷贝函数中c_ulong转为long的问题咨询

解决Python2.7自定义类深拷贝中ctypes c_ulong变为long的问题

这个问题我之前也碰到过,核心原因是Python2.7的copy.deepcopy默认不会保留ctypes原生类型的实例——当它处理c_ulong这类ctypes基本类型时,会自动提取其底层的Python数值类型(也就是long),而不是复制整个ctypes实例。所以哪怕你初始化时用的是c_ulong(),深拷贝后属性就变成了原生的long类型。

解决方案:自定义__deepcopy__方法

要解决这个问题,你需要给自定义类添加一个__deepcopy__方法,手动处理numVertices这类ctypes属性,确保拷贝后仍然是c_ulong实例。举个具体的例子:

假设你的类结构大概是这样的:

import copy
from ctypes import c_ulong

class YourCustomClass(object):
    def __init__(self):
        self.numVertices = c_ulong(0)
        # 其他属性...

你只需要给类加上下面这个方法:

def __deepcopy__(self, memo):
        # 创建当前类的新实例
        copied_instance = YourCustomClass()
        
        # 手动拷贝ctypes属性:用原实例的value创建新的c_ulong对象
        copied_instance.numVertices = c_ulong(self.numVertices.value)
        
        # 如果还有其他普通Python属性(比如列表、字典),可以用默认deepcopy处理
        # 比如 copied_instance.other_attr = copy.deepcopy(self.other_attr, memo)
        
        return copied_instance

为什么这样有效?

默认的deepcopy会递归遍历对象的所有属性,对于c_ulong这类ctypes类型,它的内部拷贝逻辑是返回value属性对应的Python原生数值。而我们手动创建新的c_ulong实例并赋值原数值,就能强制保留ctypes的类型,避免被转换成long。

验证一下

现在执行深拷贝后,检查类型就会符合预期了:

original = YourCustomClass()
copied = copy.deepcopy(original)

print(type(original.numVertices))  # <class 'ctypes.c_ulong'>
print(type(copied.numVertices))     # <class 'ctypes.c_ulong'>,不再是long!

内容的提问来源于stack exchange,提问作者user3566186

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:33:04