【问题标题】:Slicing a list without copying切片列表而不复制
【发布时间】:2015-07-07 16:52:05
【问题描述】:

这是我在论坛上的第一个问题,而且我对 Python 也很陌生,所以也许这没有多大意义,但我只是想知道......

这是非常相关的,但 IMO 这个问题Slicing a list in Python without generating a copy 没有回答如何以改变切片会改变原始的方式对列表进行切片的问题?

说,如果我只想更改函数中列表的一部分,并确保该函数无法访问所有成员,我该怎么写:

def myFunc(aList):
    for i in range(0,len(aList)):
        aList[i] = 0

wholeList = range(0,10)
partOfList = wholeList[3:6]
myFunc(partOfList)

所以最后wholeList会是

[0, 1, 2, 0, 0, 0, 6, 7, 8, 9] 

??

如果wholeList 的内容是可变对象,我想这会起作用,但是使用数字是让myFunc 返回更改后的列表并在调用工作区中分配的唯一方法?

【问题讨论】:

    标签: python list slice


    【解决方案1】:

    如果您只想修改列表的一部分,您可以只发送该切片,然后使用 return 将修改分配给同一部分:

    def myFunc(aList):
        for i in range(0,len(aList)):
            aList[i] = 0
        return aList
    
    wholeList = range(0,10)
    wholeList[3:6] = myFunc(wholeList[3:6])
    

    否则,正如您之前所说,您只是在创建新列表,而这些新列表恰好引用了原始切片中包含的内容,您必须将对新列表的任何修改重新分配回旧列表。

    为了进一步说明,wholeList[3:6]partOfList元素 是相同的对象。但这些列表只是对这些对象的引用。所以id(wholeList[3]) == id(partOfList[0]),但是如果我们更改其中一个引用,例如partOfList[0] = 10,那么我们将partOfList[0]reference 更改为10,而不是实际的object (3) 被指向。因此,此修改中没有任何动作可以反映 wholeList 中的任何更改,因为它仍在引用原始对象..

    【讨论】:

    • 感谢您的澄清。仅包含对实际对象的引用的列表概念对我来说或多或少是清楚的...我想我真正想问的是是否可以创建一个包含与 @987654332 相同的引用的 partOfList @,但不是全部。因此,无需显式分配即可仅更改wholeList 的一部分。我想答案是“不”。
    • @Juspe 没错,它们只是引用列表,修改列表中的一个元素不会反映在任何其他列表中只要这些对象是不可变的。如果它们是可变对象,则可以按“通过切片”更改它们。
    【解决方案2】:

    为了提供替代方案,这仅适用于 Python 2:

    In [2]: a = range(10)
    In [3]: a.__setslice__(3,6,[0]*3)
    
    In [4]: a
    Out[4]: [0, 1, 2, 0, 0, 0, 6, 7, 8, 9]
    

    但是,我会投票支持其他人提供的解决方案,因为它们更具可读性。 :))

    【讨论】:

      【解决方案3】:
      You can modify the list directly:
      >>> wholeList = range(0,10)
      >>> wholeList[3:6] = [0 for _ in range(3)] # or = [0]*3
      >>> wholeList
      [0, 1, 2, 0, 0, 0, 6, 7, 8, 9]
      

      【讨论】:

      • 请在代码中添加一个简短的解释,以使其成为更好的答案。
      猜你喜欢
      • 1970-01-01
      • 2017-07-27
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      • 2015-07-26
      • 1970-01-01
      • 2011-07-05
      相关资源
      最近更新 更多