Python中如何传递列表子集的引用以实现原地修改?
Python 子数组修改同步到原列表解决方案
根本原因
Python 原生列表的切片操作默认生成独立的浅拷贝对象,你传入函数的array[0:2]已经是和原列表无关联的新列表,因此对它的修改不会同步到原列表。
可用实现方案
方案1:传入原列表+切片索引范围(无额外依赖)
修改函数定义,额外接收要操作的切片的起止索引,在函数内直接映射到原列表的对应位置修改:
def sample(array, start, end): # 定位切片最后一位对应的原列表索引 target_index = end - 1 array[target_index] = "e" array = ["a","b","c"] sample(array, 0, 2) print(array) # 输出符合预期:['a', 'e', 'c']
如果需要对切片做更复杂的操作,所有子数组的位置都可以通过start + 子数组内偏移量的方式映射到原列表的索引,直接操作原列表即可实现修改同步。
方案2:使用NumPy数组(切片为共享内存视图)
NumPy数组的切片默认是共享底层内存的视图,不会生成新拷贝,修改切片会直接同步到原数组:
import numpy as np def sample(array): array[-1] = "e" array = np.array(["a","b","c"], dtype=str) sample(array[0:2]) print(array.tolist()) # 输出符合预期:['a', 'e', 'c']
内容的提问来源于stack exchange,提问作者Michael Horace
相关产品推荐
相关产品推荐

