Python 切片赋值和 MemoryView 的 ByteArray

python slice assignment and memoryview of bytearray

提问人:k9wan 提问时间:10/6/2023 最后编辑:juanpa.arrivillagak9wan 更新时间:10/6/2023 访问量:32

问:

对不起,如果我的英语不好,我的母语是韩语。

我正在编写部分更改字节数组的代码。 我试图为bytearray的某些部分命名memoryview,并用该memoryview更新bytearry。大致如下:

some_section_name_1 = memoryview(binary_data[section1_start:section1_end])
some_section_name_2 = memoryview(binary_data[section2_start:section2_end])

#update
some_section_name_1[:] = byte_like_object
some_section_name_2[:] = byte_like_object

但它失败了。所以我写了以下代码来检查:

section1_start, section1_end = 3, 7

binary_data = bytearray(range(8))
some_section_name_1 = memoryview(binary_data[section1_start:section1_end])
some_section_name_1[:] = bytes(range(4))
print(binary_data)

binary_data = bytearray(range(8))
whole_mv = memoryview(binary_data)
whole_mv[section1_start:section1_end] = bytes(range(4))
print(binary_data)

binary_data = bytearray(range(8))
binary_data[section1_start:section1_end] = bytes(range(4))
print(binary_data)

然后我终于想起切片会做浅拷贝,所以切片赋值只适用于那个复制的对象,而不适用于原始对象。

那么,有没有办法达到我最初的目的呢?命名 ByteArray 的某些特定部分,并使用该名称更新 ByteArray。它必须是整个字节数组吗?整个内存视图?

python-3.x slice memory查看 python-bytearray

评论


答:

0赞 juanpa.arrivillaga 10/6/2023 #1

如果我理解正确的话,你想要这样的东西:

view = memoryview(binary_data)
# the following slicing operations are constant time/space!
section1 = view[section1_start:section1_end]
section2 = view[section2_start:section2_end]

some_section_name_1[:] = byte_like_object
some_section_name_2[:] = byte_like_object

你是对的,一旦你切开了 bytearray,它就会创建一个新的 bytearray。您需要对 MemoryView 进行切片。

举个例子:

>>> binary_data = bytearray(b"foo-bar-baz")
>>> view = memoryview(binary_data)
>>> section1 = view[:3]
>>> section2 = view[-3:]
>>> binary_data
bytearray(b'foo-bar-baz')
>>> section1[:] = b"###"
>>> section2[:] = b"***"
>>> binary_data
bytearray(b'###-bar-***')

评论

1赞 k9wan 10/6/2023
这正是我想做的。 甚至很简单,令人惊讶的是,我无法想出那个方法。