class Solution:
# @param num, a list of integer
# @return a list of lists of integers
def permute(self, num):
self.res = [];
self.dfs(num, 0)
return self.res
def dfs(self, num, level):
if level == len(num):
self.res.append(num)
print(num)
return
for i in range(level, len(num)):
num[i], num[level] = num[level], num[i]
self.dfs(num, level+1)
num[i], num[level] = num[level], num[i]
上面的代码用于在给定数字集合的情况下生成所有排列。例如, num = [1,3] 结果将是: [1 3],[3,1]
但上面的代码存在一个我不明白的错误,即self.res.append(num)
。
如果我将其更改为self.res.append(num[:])
,则代码是正确的。任何人都可以解释原因吗?
使用self.res.append(num)
,结果是:
[1,3],[1,3]
使用self.res.append(num[:])
,结果是:
[1,3],[3,1]
答案 0 :(得分:4)
python list
的元素是对其他对象的引用。使用self.res.append(num)
追加时,列表增加1个元素,最后一个元素设置为引用num
指向的对象。
现在在第一种情况下,有两个对同一list
对象的引用。由于self.res[0]
和self.res[1]
引用同一个对象,因此通过其中一个执行的所有更改也可通过另一个进行。
在第二种情况下,使用num[:]
,[:]
运算符会创建一个新原始副本列表。
对于创建给定元素集合的所有排列的一般算法,请使用itertools.permutations
:
>>> from itertools import permutations
>>> print(list(permutations([1, 3])))
[(1, 3), (3, 1)]