Python有类似Java的System.arraycopy的东西吗?我不想只是复制引用(浅复制),也不想切片它(深复制w/新引用)。我想保留目标的引用(因为我有多个变量指向同一个列表),并将单个单元格从源复制到目标。就像Java的ArrayCopy一样。到目前为止,我能找到的在Python中做到这一点的唯一方法是编写我自己的。在Java中,使用System.arraycopy比滚动自己的性能更好,不确定Python中是否是这样。
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]]
d5vmydt92#
**更新:**Peter DeGlopper的方法更好。去那一个。
对不起,这是你得到的最好的:
def arrayCopy(src, srcPos, dest, destPos, length): for i in range(length): dest[i + destPos] = src[i + srcPos]
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:]
xbp102n04#
如果您使用的是类似字节的对象(支持缓冲区协议),那么您可以使用memoryview
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
4条答案
按热度按时间jmp7cifd1#
如果我遵循所描述的行为,切片赋值是Python的方法:
如果源包含对象引用,这将把对相同对象的引用分配到目标中-如果你想深度复制源数据,我认为你必须这样做:
d5vmydt92#
**更新:**Peter DeGlopper的方法更好。去那一个。
对不起,这是你得到的最好的:
cwdobuhd3#
xbp102n04#
如果您使用的是类似字节的对象(支持缓冲区协议),那么您可以使用
memoryview
这允许更快的突变。
阅读更多:https://docs.python.org/3/library/stdtypes.html#memoryview