缺少相等ctypes数组对象的属性`value`

时间:2017-05-16 09:50:54

标签: python arrays attributes ctypes attributeerror

我知道有两种方法可以用python序列data = (1, 2, 3, 4, 5, 6)创建一个c数组。

创建一个数组类,初始化它并通过value属性传递值:

array_type = ctypes.c_int * len(data)
array1 = array_type()
array1.value = data

创建数组类并在初始化期间将值作为参数传递:

array_type = ctypes.c_int * len(data)
array2 = array_type(*data)
# Or 'array2 = (ctypes.c_int * len(data))(*data)'

两者都生成相同的类型:

>>> array1
<c_int_Array_6 object at 0x1031d9510>
>>> array2
<c_int_Array_6 object at 0x1031d9400>

但是在尝试访问value属性时:

array1.value
>>> (1, 2, 3, 4, 5, 6, 7, 8, 9)
array2.value
>>> AttributeError: 'c_int_Array_6' object has no attribute 'value'

为什么array2 value属性为value?我的理解是这些数组是相同的类型,但只是初始化不同。

编辑:第一种方式动态添加属性{{1}},该属性不是数组的属性(除非它的类型为c_char或c_wchar)! 更改数组中的实际值。

1 个答案:

答案 0 :(得分:1)

您将array1.value定义为data。但是您没有明确定义array2.value。默认情况下,.value未定义(即使数组包含值)。

>>> import ctypes
>>> # Same commands that you provide
>>> # ...
>>> array1.value
(1, 2, 3, 4, 5, 6)
>>> array2.value
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'c_int_Array_6' object has no attribute 'value'

>>> list(array2)
[1, 2, 3, 4, 5, 6]
>>> array2[0]
1

>>> data_bis = (1,4,5)
>>> array2.value = data_bis
>>> array2
<__main__.c_int_Array_6 object at 0x7f86dc981560>
>>> array2.value
(1, 4, 5)

如您所见,您仍然可以使用标准python调用列表来访问array2的值。

您可以查看Python的文档,尤其是在fundamental data typesarrays and pointers上。