是否可以将列表的一部分传递给函数并通过切片修改列表?
这似乎不起作用:
def foo(a_list):
a_list[0]='abc'
x=[1,2,3,4]
foo(x[0:2])
我希望x现在是x = [' abc',2,3,4]
答案 0 :(得分:1)
没有!切片创建列表副本(请参阅the documentation)。你可以这样做:
>>> x = [1, 2, 3, 4]
>>> x[1:3] = [7, 8, 9]
>>> X
[1, 7, 8, 9, 4]
但是,当您从切片操作中获取新列表时,它是一个副本,因此更改它不会影响原始列表:
>>> x = [1, 2, 3, 4]
>>> y = x[1:3]
>>> y[0] = 5
>>> y
[5, 3]
>>> x
[1, 2, 3, 4]
答案 1 :(得分:1)
def foo(a_list):
a_list[0]='abc'
return a_list
x=[1,2,3,4]
foo(x) #it returns x=['abc',2,3,4]
答案 2 :(得分:1)
可能你试图传递x[0:2]
而不是x[0,2]
,但它不起作用的原因是因为当你创建一个切片时,你正在创建一个{{1的子阵列副本}}
您没有在该阵列的同一个实例上运行,您正在做的是传递一个全新的数组。单独传入'x'会有效,但传入x
除非您专门将其写为x[0:2]
且foo()返回x[0:2] = foo(x[0:2])
,否则不会传入。{/ p>
答案 3 :(得分:1)
没有。您描述的意义上的“列表切片”只不过是一个新列表。当您执行x[0:2]
时,结果列表不会“知道”它是作为另一个列表的切片创建的。这只是一个新的清单。
您可以做的是传递切片对象本身,与列表分开:
def foo(a_list, a_slice):
a_list[a_slice]='abc'
>>> foo(x, slice(0, 2))
>>> x
['a', 'b', 'c', 3, 4]
答案 4 :(得分:1)
正如brenns10所解释的那样,切片会创建原始数据的副本(即使在python 3.0中)。
您可以执行以下操作:
def foo(x):
x[0] = 'abc'
return x
x = [0, 1, 2, 3]
x[0:2] = foo(x[0:2]) # x = ['abc', 1, 2, 3]
虽然这可以为您提供所需的结果,但它并不能完全按照您的意愿工作。如果需要执行大量切片,则可能会出现问题,因为您必须执行大量复制。