确定python对象之间的区别
假设我有:
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()) 抛出一个例外. tup1和tup2在哪些方面实际上有所不同(除了指向内存中的不同地址),这可能导致这种情况 解决方法
每种类型的对象都可以用自己的术语定义相等.当元组具有相同的长度并且它们的内容被测试为相等时,它们是相等的.内容测试相同,因为两者都是元组,每个测试在配对时都相等.
但是,虽然嵌套元组中的整数值测试相同,但它们的类型不同.整数测试数值上的相等,所以1 == 1.0也是如此,即使一个对象是一个整数,另一个是浮点数.同样,tup1 [0] [0] == tup2 [0] [0]为真,因为双方具有相同的数值100. 虽然第一个元组有Python int对象,但你的第二个元组却没有.相反,你在这里有一个numpy特定的整数类型: >>> import numpy as np >>> tup2 = tuple(map(tuple,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'> 如果您使用 >>> np.array([100,1).tolist() [[100],[100]] >>> type(np.array([100,1).tolist()[0][0]) <class 'int'> 从array.tolist()文档:
(大胆强调我的). 从那里创建你的元组: tup2 = tuple(map(tuple,1).tolist())) 虽然.tolist()为您提供了Python类型等效的(嵌套)列表结构,但是如果您需要从现有数组中有效访问此类值,则还可以使用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |