据说 Python 的 memoryview 在切片时不会复制数据。已经完成了许多基准测试,其中一些在stackoverflow上,“证明”了这种行为。
在试图惹恼他们时,我遇到了一个我无法解释的奇怪行为:
>>> arr = bytearray(range(0,15))
>>> mem = memoryview(arr)
>>> mem[5:15] = mem[0:10]
>>> arr
bytearray(b'\x00\x01\x02\x03\x04\x00\x01\x02\x03\x04\x05\x06\x07\x08\t')
一方面,memoryview“不”复制数据。另一方面,这完全有效!
虽然我很高兴它“有效”,但我对它有效的事实感到难过。嗯......因为它不应该。
如果 Python 有 1 个字符的缓冲区,结果应该是这样的:
bytearray(b'\x00\x01\x02\x03\x04\x00\x01\x02\x03\x04\x00\x01\x02\x03\x04')
基本上,在写入第 5 个字符时,它应该已经重叠并读取了之前写入的第一个字符。这种天真的方法的一个例子:
>>> for i in range(10):
... m[i+5] = m[i]
>>> a
bytearray(b'\x00\x01\x02\x03\x04\x00\x01\x02\x03\x04\x00\x01\x02\x03\x04')
我尝试将 memoryview 大小增加到大量,但它仍然有效,这意味着 python 在后台复制数据,使 memoryview 对象变得毫无意义。
这里有什么地方我错了吗?有什么解释吗?那么memoryview是如何工作的呢?