【问题标题】:What's the point of using [:] [duplicate]使用 [:] 有什么意义 [重复]
【发布时间】:2019-07-15 00:45:52
【问题描述】:

我今天正在寻找某人使用 Python3 使用堆算法进行回溯的解决方案。解决方法如下:

def permute(self, nums):
    def backtrack(start, end):
        if start == end:
            ans.append(nums[:])
        for i in range(start, end):
            nums[start], nums[i] = nums[i], nums[start]
            backtrack(start+1, end)
            nums[start], nums[i] = nums[i], nums[start]

    ans = []
    backtrack(0, len(nums))
    return ans

现在我在看ans.append(nums[:])这一行,写nums[:]有什么意义?写nums 不能正常工作吗?

【问题讨论】:

  • 一个常见的原因是制作一个列表的副本,而不是仅仅获得对它的引用。

标签: python python-3.x list append


【解决方案1】:

考虑以下

>>> a = [1,2,3]
>>> b = [a]
>>> b[0].append(4)
>>> a
[1, 2, 3, 4]

如您所见,修改b[0] 会修改a,因为您已将对象a 存储在b 中,而不仅仅是a 的值。使用[:] 会复制列表,所以。

>>> a = [1,2,3]
>>> b = [a[:]]
>>> b[0].append(4)
>>> a
[1, 2, 3]

所以重点是传递值,而不是对象本身。

【讨论】:

    【解决方案2】:

    不,不一样,因为在 for 循环中你正在改变 nums

     nums[start], nums[i] = nums[i], nums[start]
    

    如果您将对nums 的引用附加到您的答案而不是独立副本,您将改变所有 asnwer 的子元素并最终得到一个相同排列的列表,所有这些都反映了最终值。您可以简单地尝试一下并查看结果:

    def permute(nums):
        def backtrack(start, end):
            if start == end:
                ans.append(nums)
            for i in range(start, end):
                # changing sums which will be reflected in all
                # references to nums in the ans array
                nums[start], nums[i] = nums[i], nums[start]
                backtrack(start+1, end)
                nums[start], nums[i] = nums[i], nums[start]
    
        ans = []
        backtrack(0, len(nums))
        return ans
    
    permute([1, 2, 3])
    

    都一样:

    [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
    

    您可以确认它们都指向内存中的同一个对象:

    l = permute([1, 2, 3])
    [id(el) for el in l]
    
    > [140539119291912, # all the same reference
       140539119291912,
       140539119291912,
       140539119291912,
       140539119291912,
       140539119291912]
    

    通过使用ans.append(nums[:]),您可以制作一个副本,这样nums 的进一步突变不会影响您已有的组合。

    【讨论】:

      猜你喜欢
      • 2015-08-18
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      相关资源
      最近更新 更多