在试图弄乱他们的时候,我遇到了一个我无法解释的怪异行为:
>>> 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')
一方面,记忆视图"没有"复制数据。另一方面,这完美有效!
虽然我很高兴它已经工作了#34;但我对它的工作原理感到很难过。嗯......因为它不应该。
如果Python有1个字符的缓冲区,结果应该是:
bytearray(b'\x00\x01\x02\x03\x04\x00\x01\x02\x03\x04\x00\x01\x02\x03\x04')
基本上,在写完第5个字符时,它应该重叠并读取之前写的第1个字符。这种天真方法的一个例子:
>>> 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')
我尝试将内存视图大小增加到大量,但它仍然有效,这意味着python在后台复制数据,使内存视图对象毫无意义。
我在这里有什么不对吗?任何解释? memoryview如何工作呢?
答案 0 :(得分:2)
if (dptr + size < sptr || sptr + size < dptr)
memcpy(dptr, sptr, size); /* no overlapping */
else
memmove(dptr, sptr, size);
指定 memmove
对于重叠源和目标是安全的。它如何确保安全性因具体情况和实施而异,但一种技术是从左到右工作,如果从左到右会覆盖尚未复制的数据。