Python中列表append函数的用法
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]
1 个回答
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)]