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)如果我删除打印空白列表的+[] it,current + []在result.append(current+[])中会做什么。
发布于 2018-09-24 21:31:29
它在复制名单。删除它时,会遇到List of lists changes reflected across sublists unexpectedly问题,因为外部列表包含许多对同一列表的引用,而不是对许多不同列表的引用。
您应该能够将其替换为current.copy() (使用PythonPython3.3)或list(current),以避免将来的读者产生类似的混淆。(这里有a lot of ways to copy a list。选择你喜欢的并坚持下去。)
发布于 2018-09-24 21:31:58
+ []是做什么的?
它生成一个与旧列表具有相同内容的新列表。
>>> x = [1]
>>> id(x) == id(x + [])
False
>>> x == x + []
True为什么我需要这个?
在你的结果中添加副本时,你会在你的结果中多次拥有相同的列表,每次你更新该列表时,它都会影响你的结果。
>>> x = [1, 2]
>>> result = []
>>> result.append(x)
>>> x.append(3)
>>> result.append(x)
>>> result
[[1, 2, 3], [1, 2, 3]]使ways更具可读性的一些可能的方法是
result.append(current[:])或
result.append(list(current))如果删除+ [],为什么返回空白列表
因为如果您不将副本附加到结果中,则结果中将只有一个列表,但会多次出现。在这个列表上调用.append(num[i])的频率与调用.pop()的频率一样高,这会导致该列表为空。
https://stackoverflow.com/questions/52480524
复制相似问题