Python 置换码don';我不能给出正确的结果 我写了一些函数来输出一个列表的排列,我给出了一个输入:[1 ],它应该输出[[]][],但是我的代码输出:[[]],我尝试打印日志,看起来像在代码运行的中间,它确实打印输出[[ 1 ] ],但不知道为什么它最终输出[[]]?如何修复它?有人能帮忙吗?非常感谢

Python 置换码don';我不能给出正确的结果 我写了一些函数来输出一个列表的排列,我给出了一个输入:[1 ],它应该输出[[]][],但是我的代码输出:[[]],我尝试打印日志,看起来像在代码运行的中间,它确实打印输出[[ 1 ] ],但不知道为什么它最终输出[[]]?如何修复它?有人能帮忙吗?非常感谢,python,algorithm,permutation,Python,Algorithm,Permutation,哦,你让自己很难过 在dfs内部,您正在调用dfs,如下所示: dfs(nums, visited, tmp, result) result.append(tmp) result.append(list(tmp)) 然后,在第二次迭代中,将tmp添加到result中,如下所示: dfs(nums, visited, tmp, result) result.append(tmp) result.append(list(tmp)) 然后,返回后,使用以下命令从tmp中删除1: tmp.p

哦,你让自己很难过

dfs
内部,您正在调用
dfs
,如下所示:

dfs(nums, visited, tmp, result)
result.append(tmp)
result.append(list(tmp))
然后,在第二次迭代中,将
tmp
添加到
result
中,如下所示:

dfs(nums, visited, tmp, result)
result.append(tmp)
result.append(list(tmp))
然后,返回后,使用以下命令从
tmp
中删除
1

tmp.pop()
这会将其从
tmp
中删除,但由于您也将列表
tmp
添加到
result
,您现在已经将
result
[[1]]
更改为
[[]]
-毕竟它是
tmp

你应该重新考虑这里到底需要什么。在Python中,通过引用传递变量并修改它们的内容并不是一个很好的方法。试着从功能上考虑,不要依赖副作用

如果我给出的答案听起来很复杂,那是因为您为Python中的一个简单问题创建了一个相当复杂的解决方案。例如,这里有一个更简单的解决方案:

def permutations(xs):
    if len(xs) < 2:
        yield xs
    else:
        for n in range(len(xs)):
            for continuation in permutations(xs[:n] + xs[n+1:]):
                yield [xs[n]] + continuation


print(list(permutations([1,2,3,4])))
顺便说一下,您可以像这样修复代码:

dfs(nums, visited, tmp, result)
result.append(tmp)
result.append(list(tmp))

这将创建一个副本,而不是添加
tmp
本身。但是,一旦您尝试使用较长列表的代码,例如
[1,2]
,您将遇到更多的错误,我还没有完全调试解决方案。

如果您关心实现细节,请查看由给出的答案。此外,看看答案,作者解释了计算数字列表排列的两种方法

但是,如果您只想用简洁的代码回答问题,请使用内置的itertools模块

import itertools

def permute(nums):

  # the permutation function returns itertools.permutations object
  result = itertools.permutations(nums)

  # convert the object to your desired format
  result = [list(i) for i in result]

  return result

# call the function
a = [1]
result = permute(a)
print(result)
这应该表明,

[[1]]

您已将
tmp
添加到
result
中,然后从
tmp
中弹出项目,这会影响
结果变量再次变为空白。感谢您的澄清!不客气-如果你觉得答案足够,请接受它,这样其他人就知道这个问题不再需要答案,而其他寻找答案的人可以更容易地找到它。