Python:在递归函数中使用append - 覆盖以前的元素

时间:2017-03-18 12:25:33

标签: python

有人可以解释如何解决以下问题吗?我已经阅读了一些解释,但无法理解它......

非常感谢提前!

k = 2                  # number of possible values for each element, in this case 0 or 1
length = 3             # length of list
result = [0] * length  # initialise list
results = []

# generate permutations of list
def permutations(i, k, length):
    j = 0
    while j < k:
        result[i] = j
        if i == length - 1:
            print("Result: ", result)
            results.append(result)
            print("Results: ", results)
        else:
            permutations(i + 1, k, length)
        j += 1

permutations(0, k, length)

输出下方。问题是列表中的所有先前元素都被覆盖了......

Result:  [0, 0, 0]
Results:  [[0, 0, 0]]
Result:  [0, 0, 1]
Results:  [[0, 0, 1], [0, 0, 1]]
Result:  [0, 1, 0]
Results:  [[0, 1, 0], [0, 1, 0], [0, 1, 0]]
Result:  [0, 1, 1]
Results:  [[0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1]]
Result:  [1, 0, 0]
Results:  [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
Result:  [1, 0, 1]
Results:  [[1, 0, 1], [1, 0, 1], [1, 0, 1], [1, 0, 1], [1, 0, 1], [1, 0, 1]]
Result:  [1, 1, 0]
Results:  [[1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0]]
Result:  [1, 1, 1]
Results:  [[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]

3 个答案:

答案 0 :(得分:2)

您每次都会附加相同的列表。通过该引用修改列表会将更改传播到列表对象所在的每个位置;它是同一个清单。

您应该添加浅层副本,因此引用result仅修改当前列表:

...
results.append(result[:])

否则,您可以在函数的开头创建一个新的列表对象,以便每个递归调用都有自己的列表:

def permutations(i, k, length):
    result = []
    ...

答案 1 :(得分:0)

我相信将results.append(result)更改为result.append(result [:])应该可以解决问题。这是因为列表的可变性

答案 2 :(得分:0)

您实施的内容可以描述为重复排列或cartesian product

可以通过这种方式生成k ** length个列表或元组。

与任何组合,排列或产品一样,itertools可以为您提供帮助:

from itertools import product

k = 2                  # number of possible values for each element, in this case 0 or 1
length = 3             # length of list

print(list(product(range(k), repeat=length)))
#[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]

完成!