如何比较memoryview对象?

3

有人对以下代码有什么想法吗?

>>> memoryview("abc") < memoryview("bca")
True
>>> memoryview("abc") > memoryview("bca")
True
>>> memoryview("abc") = memoryview("bca")
False

如何在不使用 tobytes 复制字符串的情况下比较 memoryview 对象的字符串?

1个回答

3

memoryview()对象不定义任何顺序,它的__lt____gt__方法返回NotImplemented单例,表示它们不支持排序:

>>> memoryview("abc").__lt__(memoryview('bca'))
NotImplemented
>>> memoryview("abc").__gt__(memoryview('bca'))
NotImplemented

因此,在Python 2中,这些对象会使用内部的一致排序进行排序。在Python 3中,当您尝试使用<>运算符时,将引发TypeError
在Python 2中,当对象不支持排序时,它们将按其内存地址排序(对于对象本身,而不是内存视图所指向的“内存”);有关发生的详细信息,请参见Custom class ordering: no error thrown, what is Python testing for?
仅支持相等性和不等式测试:
>>> memoryview("abc").__eq__(memoryview('bca'))
False
>>> memoryview("abc").__eq__(memoryview('abc'))
True
>>> memoryview("abc").__ne__(memoryview('abc'))
False
>>> memoryview("abc").__ne__(memoryview('bca'))
True

您唯一的选择是使用 .tobytes().tolist()

在2.x中,由于它们是相同类型,因此会回退到比较内存地址(object.c,默认的3路比较,v2.7.3)。使用临时对象在顺序语句中执行比较操作会导致地址在每次运行时交换。因此,如果您重复进行相同的LT或GT测试,则结果在True和False之间交替。 - Eryk Sun
@eryksun:我已经指向了我之前关于这个主题的答案,满意吗? :-) - Martijn Pieters
主要是“Python 2对这种操作返回False”这一行引起了我的评论。虽然我也觉得PyObject_Malloc的交替地址分配有点有趣,因为它导致了连续的LT/GT测试都返回True。 - Eryk Sun
@eryksun:没错,那行代码确实有问题。已经修正了。是的,地址重复使用确实很有趣。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接