Как меняется буфер
1️⃣В data лежат байты AB. Вызов memoryview(data) создаёт представление того же буфера, не копию данных.
2️⃣Присваивание data[0] = ord("Z") заменяет первый байт без изменения размера. Представление видит эту запись, поэтому первый print выводит b'ZB'.
3️⃣Вызов append пытается увеличить bytearray. Пока view активно, изменение размера запрещено: возникает BufferError, обработчик печатает blocked. Байт C не добавляется.
4️⃣Вызов view.release() освобождает представление. Теперь ограничение на изменение размера, связанное с этим view, снято. Сам bytearray при этом остаётся.
5️⃣Второй append успешно добавляет C. Последний print выводит b'ZBC'. Все три строки: b'ZB', blocked, b'ZBC'.
Почему это важно
Представления помогают обрабатывать бинарные пакеты без копирования. Пока такое представление активно, можно заменять байты внутри буфера, но нельзя расширять bytearray. Перед расширением нужно освободить все активные представления этого буфера.
Post #4936
119