递归中

时间:2016-05-23 14:46:25

标签: python recursion

以下代码返回所提供数字的所有可能排列。

class Solution:

  def permute(self, numbers, start, result):
        if start == len(numbers):
            print(numbers)
            result.append(numbers[:])
            return
        for i in range(start, len(numbers)):
            numbers[start], numbers[i] = numbers[i], numbers[start]
            self.permute(numbers, start + 1, result)
            numbers[start], numbers[i] = numbers[i], numbers[start]

  def solution(self, numbers):
        result = []
        if not numbers or len(numbers) == 0:
            return numbers
        self.permute(numbers, 0, result)
        return result

res1 = Solution().solution([1, 2, 3])
print(res1)

此实例的最终输出将是

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

但是当我略微修改permute函数时,输出完全不同

def permute(self, numbers, start, result):
        if start == len(numbers):
            print(numbers)
            result.append(numbers) #changing this line
            return
        for i in range(start, len(numbers)):
            numbers[start], numbers[i] = numbers[i], numbers[start]
            self.permute(numbers, start + 1, result)
            numbers[start], numbers[i] = numbers[i], numbers[start]

给出输出

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

当我使用

时程序可以正常工作
result.append([x for x in numbers])

result.append(numbers[:])

但不是我用的时候

result.append(numbers)

有人可以帮我理解为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

如果您没有使用您所描述的技术创建对象的副本,则会一次又一次地将相同的对象放入列表中。

以下是一个简短示例来说明问题:

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