确定 python 个对象之间的差异
Determine difference between python objects
假设我有:
tup1 = ((100,), (100,))
tup2 = tuple(map(tuple, np.array([100, 100]).reshape(-1,1)))
现在 tup1 == tup2
returns 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())
抛出异常。 tup1
和 tup2
实际上有哪些不同(除了指向内存中的不同地址)可能导致此
每种类型的对象都可以用自己的术语定义相等性。当元组具有相同的长度并且它们的 contents 被测试为相等时,它们是相等的。内容测试相等,因为两者也是配对时每个测试相等的元组。
但是虽然 在 嵌套元组中的整数值测试相等,但它们 类型不同 。整数测试数值是否相等,因此 1 == 1.0
也是正确的,即使一个对象是整数,另一个是浮点数。同理,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 获取单个值来自现有数组的此类值。
tup1 == tup2
可能是正确的,但类型并不相同。尝试以下并说服自己:
[[type(dt) for dt in t] for t in tup1]
和
[[type(dt) for dt in t] for t in tup2]
假设我有:
tup1 = ((100,), (100,))
tup2 = tuple(map(tuple, np.array([100, 100]).reshape(-1,1)))
现在 tup1 == tup2
returns 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())
抛出异常。 tup1
和 tup2
实际上有哪些不同(除了指向内存中的不同地址)可能导致此
每种类型的对象都可以用自己的术语定义相等性。当元组具有相同的长度并且它们的 contents 被测试为相等时,它们是相等的。内容测试相等,因为两者也是配对时每个测试相等的元组。
但是虽然 在 嵌套元组中的整数值测试相等,但它们 类型不同 。整数测试数值是否相等,因此 1 == 1.0
也是正确的,即使一个对象是整数,另一个是浮点数。同理,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()
:
>>> 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 获取单个值来自现有数组的此类值。
tup1 == tup2
可能是正确的,但类型并不相同。尝试以下并说服自己:
[[type(dt) for dt in t] for t in tup1]
和
[[type(dt) for dt in t] for t in tup2]