Python列表切片传入函数后未修改原列表?求原因及解决办法
问题原因与解决方法
为什么代码不生效?
调用Test(L[1:])时,L[1:]是列表切片操作,它会生成原列表从索引1开始的元素的新副本,而非原列表的引用。Test函数里修改的只是这个临时副本的元素,原列表L完全没被改动,所以打印结果还是初始值。
解决方法
方法一:修改函数返回结果并赋值回原列表
调整Test函数让它返回处理后的列表,再将结果赋值给原列表的切片位置:
def Test(L): for i in range(len(L)): L[i] = L[i][1:] return L L = ["-stackoverflow", "-Python", "-C++"] L[1:] = Test(L[1:]) print(L)
方法二:直接操作原列表的指定索引范围
修改函数,传入起始索引,直接在原列表上修改对应位置的元素:
def Test(L, start_idx): for i in range(start_idx, len(L)): L[i] = L[i][1:] L = ["-stackoverflow", "-Python", "-C++"] Test(L, 1) print(L)
方法三:用列表推导式简化操作
无需额外函数,直接通过列表推导式处理切片部分并赋值:
L = ["-stackoverflow", "-Python", "-C++"] L[1:] = [s[1:] for s in L[1:]] print(L)
以上三种方法都能得到期望输出:['-stackoverflow', 'Python', 'C++']
内容的提问来源于stack exchange,提问作者Ghoudiy
相关产品推荐
相关产品推荐

