首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从bytearray转换为bytearray会导致复制吗?

从bytearray转换为bytearray会导致复制吗?
EN

Stack Overflow用户
提问于 2016-03-09 07:24:29
回答 2查看 10.3K关注 0票数 11

从可变的bytearray类型转换为不可变的bytes类型是否会导致复制?是否有任何相关的开销,或者解释器只是将其视为不可变的字节序列,就像在C++中将char*转换为const char* const一样?

代码语言:javascript
复制
ba = bytearray()
ba.extend("some big long string".encode('utf-8'))

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

在Python3中,bytes是它自己的类型,而在Python2.7中,bytes只是str的别名,这两种情况有什么不同吗

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-09 07:29:15

在Python2或3中,创建了一个新的副本,缓冲区不会在bytesarray和新的bytes对象之间共享。

您不能共享它,因为bytesarray对象仍然可能在其他地方被引用并改变值。

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

票数 20
EN

Stack Overflow用户

发布于 2016-03-09 08:10:47

马特金是对的。我只是想用cpython源代码来支持这个答案。

查看字节here的源,第一个bytes_new被调用,它将调用PyBytes_FromObject,后者将调用_PyBytes_FromBuffer,后者创建一个新的bytes对象并调用PyBuffer_ToContiguous (定义的here)。这将调用buffer_to_contiguous,它是一个内存复制函数。该函数的注释为:

将源复制到连续的表示形式。order是'C‘、'F’(Fortran)或'A‘(Any)之一。假设: src具有PyBUF_FULL信息,src->ndim >= 1,len(mem) == src->len。

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35880065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档