从bytearray转换为字节会产生副本吗?

时间:2016-03-08 23:24:29

标签: python bytearray python-internals

从可变bytearray类型转换为非可变bytes类型会产生副本吗?是否有与之相关的成本,或者解释器是否将其视为不可变的字节序列,例如在C ++中将char*转换为const char* const

ba = bytearray()
ba.extend("some big long string".encode('utf-8'))

# Is this conversion free or expensive?
write_bytes(bytes(ba))

在{3}是自己的类型的Python 3和在bytes只是bytes的别名的Python 2.7之间有不同吗?

2 个答案:

答案 0 :(得分:13)

创建一个新副本,在{2}或者Python 3中,bytesarray和新bytes对象之间不共享缓冲区。

你无法分享它,因为bytesarray对象仍然可以在别处引用并改变该值。

有关详细信息,请参阅bytesobject.c source code,其中buffer protocol用于创建数据的直接副本(通过PyBuffer_ToContiguous())。

答案 1 :(得分:7)

Martjin是对的。我只是想用cpython源代码来回答这个问题。

查看字节here的来源,调用第一个bytes_new,它将调用PyBytes_FromObject,它将调用_PyBytes_FromBuffer,这将创建一个新的字节对象并调用PyBuffer_ToContiguous(已定义here)。这会调用buffer_to_contiguous,这是一个内存复制功能。该函数的注释如下:

  

将src复制到连续的表示。订单是' C' F' F' (Fortran)或' A' (任何)。假设:src有PyBUF_FULL信息,src-> ndim> = 1,len(mem)== src-> len。

因此,使用bytearray参数调用字节将复制数据。