提问人:k9wan 提问时间:10/6/2023 最后编辑:juanpa.arrivillagak9wan 更新时间:10/6/2023 访问量:32
Python 切片赋值和 MemoryView 的 ByteArray
python slice assignment and memoryview of bytearray
问:
对不起,如果我的英语不好,我的母语是韩语。
我正在编写部分更改字节数组的代码。 我试图为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。它必须是整个字节数组吗?整个内存视图?
答:
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
这正是我想做的。 甚至很简单,令人惊讶的是,我无法想出那个方法。
上一个:如何显示每个切片的起始图
评论