Python有类似Java的System.arraycopy的东西吗?

dwbf0jvd  于 2023-05-15  发布在  Java
关注(0)|答案(4)|浏览(125)

Python有类似Java的System.arraycopy的东西吗?我不想只是复制引用(浅复制),也不想切片它(深复制w/新引用)。我想保留目标的引用(因为我有多个变量指向同一个列表),并将单个单元格从源复制到目标。就像Java的ArrayCopy一样。到目前为止,我能找到的在Python中做到这一点的唯一方法是编写我自己的。在Java中,使用System.arraycopy比滚动自己的性能更好,不确定Python中是否是这样。

jmp7cifd

jmp7cifd1#

如果我遵循所描述的行为,切片赋值是Python的方法:

foo = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
bar = foo
baz = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
foo[0:4] = baz[0:4]

>>> foo
[10, 9, 8, 7, 4, 5, 6, 7, 8, 9]
>>> bar
[10, 9, 8, 7, 4, 5, 6, 7, 8, 9]

如果源包含对象引用,这将把对相同对象的引用分配到目标中-如果你想深度复制源数据,我认为你必须这样做:

foo[0:4] = [copy.deepcopy(x) for x in baz[0:4]]
d5vmydt9

d5vmydt92#

**更新:**Peter DeGlopper的方法更好。去那一个。

对不起,这是你得到的最好的:

def arrayCopy(src, srcPos, dest, destPos, length):
    for i in range(length):
        dest[i + destPos] = src[i + srcPos]
cwdobuhd

cwdobuhd3#

def array_copy(src: bytes, src_pos: int, dest: bytes, dest_pos: int, length: int) -> bytes:
return dest[:dest_pos]+src[src_pos:length]+dest[dest_pos+length:]
xbp102n0

xbp102n04#

如果您使用的是类似字节的对象(支持缓冲区协议),那么您可以使用memoryview

k = [3, 4, 1, 1, 9, 7, 6]
bk = bytearray(k)
mk = memoryview(bk)
mk.obj
mk[3:5] = b"hu"
mk.obj

这允许更快的突变。
阅读更多:https://docs.python.org/3/library/stdtypes.html#memoryview

相关问题