# memoryview() - [概要](#概要) - [Python缓冲区协议](#python缓冲区协议) - [什么是内存视图?](#什么是内存视图) - [为什么缓冲区协议和内存视图很重要?](#为什么缓冲区协议和内存视图很重要) - [memoryview 详解](#memoryview-详解) - [memoryview()参数](#memoryview参数) - [从memoryview()返回值](#从memoryview返回值) - [示例](#示例) ## 概要   `memoryview()`函数返回给定参数的内存视图对象。   在了解什么是内存视图之前,需要首先了解什么是缓冲区协议。 ### Python缓冲区协议   缓冲区协议提供了一种访问对象内部数据的方法。该内部数据是存储阵列或缓冲区。   缓冲区协议允许一个对象公开其内部数据(缓冲区),而另一个对象无需中间复制即可访问这些缓冲区。   只能在C-API级别上访问此协议,而不能使用常规代码库。   因此,为了将相同的协议公开给普通的Python代码库,需要使用内存视图。 ### 什么是内存视图?   内存视图是在Python中公开缓冲区协议的安全方法。   允许通过创建内存视图对象来访问对象的内部缓冲区。 ### 为什么缓冲区协议和内存视图很重要?   每当对对象执行某些操作(调用对象的函数,对数组进行切片)时,Python都需要创建**该对象**的**副本**。   处理大量数据(例如,图像的二进制数据),则不必要地创建大量数据的副本,这几乎毫无用处。   使用缓冲协议,可以给另一个对象访问权限以使用/修改大数据,而无需复制它。这使程序使用更少的内存并提高了执行速度。 ## memoryview 详解   要使用公开缓冲区协议`memoryview()`,使用以下语法: ```python memoryview(obj) ``` ### memoryview()参数   `memoryview()`函数采用单个参数: - **obj-**要公开其内部数据的对象。`obj`必须支持缓冲协议(bytes,bytearray)。 示例: ```python >>> memoryview(b'\x00') <memoryview> ``` ### 从memoryview()返回值   `memoryview()`函数返回一个内存视图对象。 ## 示例   使用memoryview() ```python random_byte_array = bytearray('ABC', 'utf-8') mv = memoryview(random_byte_array) print(mv[0]) print(bytes(mv[0:2])) print(list(mv[0:3])) ```   第一行创建utf8格式的bytearray对象ABC   第二行创建了一个内存视图对象 MV   第三行访问了 MV的第0个索引,'A'并打印出来(给出ASCII值-65)   第四行访问了 MV的索引从0和1开始'AB',并将其转换为字节   第五行访问了 MV的索引从0和2开始'ABC',并将其转换为字节