从可变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之间有不同吗?
答案 0 :(得分:13)
创建一个新副本,在{2}或者Python 3中,bytesarray
和新bytes
对象之间不共享缓冲区。
你无法分享它,因为bytesarray
对象仍然可以在别处引用并改变该值。
有关详细信息,请参阅bytesobject.c
source code,其中buffer protocol用于创建数据的直接副本(通过PyBuffer_ToContiguous()
)。
答案 1 :(得分:7)
查看字节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参数调用字节将复制数据。