gpt4 book ai didi

python - 关于 python ctypes 中调整大小的问题

转载 作者:行者123 更新时间:2023-12-01 05:57:56 25 4
gpt4 key购买 nike

我找到了在 python ctypes 中调整数组大小的一个答案

from ctypes import *

list = (c_int*1)()

def customresize(array, new_size):
resize(array, sizeof(array._type_)*new_size)
return (array._type_*new_size).from_address(addressof(array))

list[0] = 123
list = customresize(list, 5)

>>> list[0]
123
>>> list[4]
0

如果我再次调用它:

list = customresize(list, 40)

它给出错误:

ValueError: Memory cannot be resized because this object doesn't own it

为什么它只在第一次调用 customresize() 时有效?我还看到有人发表了另一个答案:

def customresize(array, new_size):
return (array._type_*new_size).from_address(addressof(array))

此处 customresize() 无论调用多少次都会起作用。

但它提出了另一个问题,我发现当您将 list 调整为更大的大小时,我的 python.exe 不会使用更多内存,这意味着没有为调整大小的 list 分配内存。在不分配的情况下提供内存访问权限是否非常危险?为什么ctypes.resize是这样设计的?真的很困惑......

最佳答案

from_address 很危险,因为它不能确保您已分配正在访问的内存,因此可能会导致您的应用程序崩溃或更糟。此外,它不拥有它所指向的内存,因此如果删除原始所有者,则内存可以重新用于其他用途。

这里的一个选择是保留对原始数组的引用:

def customresize(array, new_size):
base = getattr(array, 'base', array)
resize(base, sizeof(array._type_)*new_size)
new_array = (array._type_*new_size).from_address(addressof(base))
new_array.base = base

另一种更安全的方法是,您可以从旧数组创建一个新数组:

list = (c_int * 5)(*list)

关于python - 关于 python ctypes 中调整大小的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11634342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com