gpt4 book ai didi

python - 确定 python 对象之间的差异

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:15 24 4
gpt4 key购买 nike

假设我有:

tup1 = ((100,), (100,))
tup2 = tuple(map(tuple, np.array([100, 100]).reshape(-1,1)))

现在 tup1 == tup2 返回 True(我意识到它来自结构相等)。

但是,作为某些 python 项目的一部分,我正在尝试执行以下操作:

from comtypes.automation import (byref, windll, 
POINTER, VARIANT, PyDLL, py_object, wintypes)

_dll = PyDLL(pythoncom.__file__)
_pack = _dll.PyCom_VariantFromPyObject
_pack.argtypes = py_object, POINTER(VARIANT)
_pack.restype = wintypes.BOOL

现在

_pack(tup1, VARIANT())

工作时

_pack(tup2, VARIANT())

抛出异常。 tup1tup2 实际上有哪些不同(除了指向内存中的不同地址)会导致这种情况

最佳答案

每种类型的对象都可以用自己的术语定义相等性。当元组具有相同的长度并且它们的内容被测试为相等时,它们是相等的。内容测试相等,因为两者也是配对时每个测试相等的元组。

但是虽然嵌套元组中的整数值测试相等,但它们不是同一类型。整数测试数值的相等性,因此 1 == 1.0 也是正确的,即使一个对象是整数,另一个是 float 。同样,tup1[0][0] == tup2[0][0] 为真,因为两边的数值相同,都是 100。

虽然第一个元组有 Python int 对象,但第二个元组没有。相反,您在这里有一个 numpy 特定整数类型:

>>> import numpy as np
>>> tup2 = tuple(map(tuple, np.array([100, 100]).reshape(-1,1)))
>>> tup2[0][0]
100
>>> type(tup2[0][0])
<class 'numpy.int64'>

这很难看出,因为值的表示看起来与 Python int 类型完全相同,但对于您正在进行的特定 C API 调用,numpy.int64 未被识别为可接受的类型。

您需要将那些 int64 对象转换回标准 Python 整数:

>>> int(tup2[0][0])
100
>>> type(int(tup2[0][0]))
<class 'int'>

如果您使用 array.tolist(),您实际上可以告诉 numpy 数组为您执行此操作:

>>> np.array([100, 100]).reshape(-1,1).tolist()
[[100], [100]]
>>> type(np.array([100, 100]).reshape(-1,1).tolist()[0][0])
<class 'int'>

来自 array.tolist() 文档:

Return a copy of the array data as a (nested) Python list. Data items are converted to the nearest compatible Python type.

(大胆强调我的)。

从那里创建你的元组:

tup2 = tuple(map(tuple, np.array([100, 100]).reshape(-1,1).tolist()))

虽然 .tolist() 为您提供了 Python 类型等效项的(嵌套)列表结构,但您也可以使用 numpy.item() method 获取单个值,如果您需要从现有数组中高效访问此类值。

关于python - 确定 python 对象之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53100992/

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