Говорят, что представление памяти Python не копирует данные при нарезке. Было проведено множество тестов, некоторые из которых проводились на 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-го символа он должен был перекрываться и читать 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')
Я попытался увеличить размер memoryview до больших значений, но он все еще работает, то есть python копирует данные в фоновом режиме, делая объекты memoryview совершенно бессмысленными.
Я где-то здесь не прав? Любое объяснение? Как тогда работает memoryview?