【问题标题】:Python, how can I change in-place a sub array?Python,如何就地更改子数组?
【发布时间】:2019-07-05 13:34:57
【问题描述】:

比如我有一个函数

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

a = [1,2,3]

foo(a) 就地更改了a 的值,但foo(a[:1]) 没有。 请帮助让我知道如何使foo(a[:1])就地更改a的值

【问题讨论】:

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

标签: python list in-place sub-array


【解决方案1】:

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

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

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

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

i 是您的切片索引。

【讨论】:

    【解决方案2】:

    您可以尝试使用索引。

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

    【讨论】:

    • 我想递归地做,所以下一个列表是当前列表的一部分。
    猜你喜欢
    • 2018-07-17
    • 2019-02-20
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多