修改传递给函数的列表切片

时间:2015-07-16 01:11:16

标签: python python-2.7

是否可以将列表的一部分传递给函数并通过切片修改列表?

这似乎不起作用:

def foo(a_list):
  a_list[0]='abc'

x=[1,2,3,4]
foo(x[0:2])

我希望x现在是x = [' abc',2,3,4]

5 个答案:

答案 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]

虽然这可以为您提供所需的结果,但它并不能完全按照您的意愿工作。如果需要执行大量切片,则可能会出现问题,因为您必须执行大量复制。