在递归函数中添加带有列表的空列表

时间:2018-09-24 13:27:54

标签: python python-3.x

def permute(nums):
    result = []
    get_permute([], nums, result)
    return result

def get_permute(current, num, result):

    if not num:
        result.append(current+[])

    for i, v in enumerate(num):
        current.append(num[i])
        get_permute(current, num[:i] + num[i + 1:], result)
        current.pop()

if __name__ == "__main__":

    r = permute([1,2,3])

    for perm in r:
        print(perm)

如果current + []删除了result.append(current+[])打印空白列表的内容,在+[]中会做什么。

2 个答案:

答案 0 :(得分:4)

它正在复制列表。删除它时,您会遇到List of lists changes reflected across sublists unexpectedly问题,因为外部列表包含对同一列表的许多引用,而不是对许多不同列表的引用。

您应该可以将其替换为current.copy()(使用Python> = 3.3)或list(current),以避免将来的读者出现类似的困惑。 (有a lot of ways to copy a list。选择您喜欢的一个并坚持下去。)

答案 1 :(得分:2)

+ []会做什么?

它会生成一个与旧列表具有相同内容的新列表。

>>> x = [1]
>>> id(x) == id(x + [])
False
>>> x == x + []
True

我为什么需要这个?

Whitout将副本添加到结果中时,结果中将有很多次相同的列表,并且每次更新该列表时,都会影响结果。

>>> x = [1, 2]
>>> result = []
>>> result.append(x)
>>> x.append(3)
>>> result.append(x)
>>> result
[[1, 2, 3], [1, 2, 3]]

一些使方法更具可读性的可能方法是

result.append(current[:])

result.append(list(current))

如果删除+ [],为什么会返回空白列表?

因为如果您不将副本附加到结果中,则结果中将只有一个列表,但是会出现多次。并且您在该列表上调用.append(num[i])的频率与.pop()相同,因此该列表为空。