Python,如何在适当的位置更改子数组?

Python,如何在适当的位置更改子数组?,python,list,in-place,sub-array,Python,List,In Place,Sub Array,例如,我有一个函数 def foo(a): a[0],a[1] = a[1], a[0] 及 foo(a)更改a的值,但foo(a[:1])不更改。 请帮助让我知道如何使foo(a[:1])更改a的值到位您可以尝试使用索引 def foo(a, n): a[n],a[n+1] = a[n+1], a[n] 您可以尝试使用索引 def foo(a, n): a[n],a[n+1] = a[n+1], a[n] 正如其他人所提到的,当你切片一个列表时,它会创建一个新的副

例如,我有一个函数

def foo(a):
    a[0],a[1] = a[1], a[0]

foo(a)
更改
a
的值,但
foo(a[:1])
不更改。
请帮助让我知道如何使
foo(a[:1])
更改
a的值
到位

您可以尝试使用索引

def foo(a, n):
    a[n],a[n+1] = a[n+1], a[n]

您可以尝试使用索引

def foo(a, n):
    a[n],a[n+1] = a[n+1], a[n]

正如其他人所提到的,当你切片一个列表时,它会创建一个新的副本,这是你正在修改的地方。考虑一下:

def foo(a):
    a[0], a[1] = a[1], a[0]
    return a

a = [1,2,3]
a[1:] = foo(a[1:])


其中,
i
是您的切片索引。

正如其他人所提到的,当您对列表进行切片时,它会创建一个新的副本,这是您正在修改的内容。考虑一下:

def foo(a):
    a[0], a[1] = a[1], a[0]
    return a

a = [1,2,3]
a[1:] = foo(a[1:])


其中
i
是切片索引。

list
切片创建新的列表对象。您传入的
foo(a[:1])
列表确实发生了变化。但是,您将丢失对该列表的所有引用,因此当函数终止且其引用计数变为0时,该列表将立即被垃圾收集。注意,您使用的是列表而不是数组。谢谢,所以正确的问题应该是如何使用对同一对象的引用进行切片?无论如何,python中的list是一个动态数组。我想递归地传递当前列表的一段,但这样做不会改变原始列表中的任何内容。如果不创建新列表,则无法对列表进行切片。您可以实现自己的切片功能,创建一个完成此操作的包装器类,或者只传递索引。我提到了
list
对象,因为Python确实有数组,但
list
不是数组。通常,在Python的上下文中,“array”特别指
numpy.ndarray
对象,甚至是
array.array
对象。请注意,
numpy.ndarray
对象会生成原始数组的视图,因此如果您实际使用数组,这会起作用!谢谢,对不起,我弄糊涂了。我希望有一种方法可以通过切片传递引用。
list
slicing创建新的列表对象。您传入的
foo(a[:1])
列表确实发生了变化。但是,您将丢失对该列表的所有引用,因此当函数终止且其引用计数变为0时,该列表将立即被垃圾收集。注意,您使用的是列表而不是数组。谢谢,所以正确的问题应该是如何使用对同一对象的引用进行切片?无论如何,python中的list是一个动态数组。我想递归地传递当前列表的一段,但这样做不会改变原始列表中的任何内容。如果不创建新列表,则无法对列表进行切片。您可以实现自己的切片功能,创建一个完成此操作的包装器类,或者只传递索引。我提到了
list
对象,因为Python确实有数组,但
list
不是数组。通常,在Python的上下文中,“array”特别指
numpy.ndarray
对象,甚至是
array.array
对象。请注意,
numpy.ndarray
对象会生成原始数组的视图,因此如果您实际使用数组,这会起作用!谢谢,对不起,我弄糊涂了。我希望有一种通过切片传递引用的方法。我想递归地传递引用,所以下一个列表是当前列表的一段。我想递归地传递引用,所以下一个列表是当前列表的一段。