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

JDS*_*JDS 7 python bytearray python-internals

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

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

# Is this conversion free or expensive?
write_bytes(bytes(ba))
Run Code Online (Sandbox Code Playgroud)

这是不同的Python 3,bytes它自己的类型和Python 2.7,bytes它只是一个别名str

Mar*_*ers 14

创建一个新副本,在Python 2或3中,不在bytesarraybytes对象之间共享缓冲区.

您无法共享它,因为该bytesarray对象仍可在其他地方引用并改变该值.

有关详细信息,请参阅bytesobject.c源代码,其中缓冲区协议用于创建数据的直接副本(via PyBuffer_ToContiguous()).


Nig*_*000 8

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

这里查看字节的来源,首先bytes_new调用,它将调用PyBytes_FromObject,它将调用,这将_PyBytes_FromBuffer创建一个新的字节对象和调用PyBuffer_ToContiguous(在此处定义).这调用buffer_to_contiguous,这是一个内存复制功能.该函数的注释如下:

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

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