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+[])
打印空白列表的内容,在+[]
中会做什么。
答案 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()
相同,因此该列表为空。