Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复python中返回带有空数组元素的2d数组的方法?_Python_Arrays - Fatal编程技术网

如何修复python中返回带有空数组元素的2d数组的方法?

如何修复python中返回带有空数组元素的2d数组的方法?,python,arrays,Python,Arrays,下面的代码实现了回溯算法,以查找给定数字数组的所有可能排列,并且记录变量在代码达到基本情况时存储排列。代码似乎是相应地运行的,也就是说,记录变量被有效的排列填充,但是由于某种原因,当方法完成时,该方法返回一个元素为空的二维数组 我尝试将record声明为元组或字典,并尝试使用全局变量和非局部变量,但都不起作用 def permute(arr): record = [] def createPermutations(currentArr, optionArr): i

下面的代码实现了回溯算法,以查找给定数字数组的所有可能排列,并且记录变量在代码达到基本情况时存储排列。代码似乎是相应地运行的,也就是说,记录变量被有效的排列填充,但是由于某种原因,当方法完成时,该方法返回一个元素为空的二维数组

我尝试将
record
声明为元组或字典,并尝试使用全局变量和非局部变量,但都不起作用

def permute(arr):
    record = []
    def createPermutations(currentArr, optionArr):
        if len(optionArr) == 0:
            if len(currentArr) != 0: record.append(currentArr)
            else: pass
            print(record)
        else:
            for num in range(len(optionArr)):
                currentArr.append(optionArr[num])
                option = optionArr[0:num] + optionArr[num+1::]
                createPermutations(currentArr, option)
                currentArr.pop()

    createPermutations([], arr)
    return record

print(permute([1,2,3]))

预期结果应该是[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,2,1],[3,2,1],[3,2,1],但我得到的是[],[],[],[],[],[],[],[],[],[]。

使用递归函数,应该传递当前数组的副本,而不是让所有这些
currentArr.pop()
对同一数组进行变异

替换

createPermutations(currentArr, option)

最后,作为递归的学习练习,类似这样的练习很好,但如果您需要为实际编程问题进行排列,请使用:


我会接受John Coleman的回答,因为这是解决您的问题并解决您因此遇到的其他错误的正确方法

之所以会遇到这个问题,是因为python是通过对象引用传递的,在对象引用中,不会传递列表的副本,而是传递实际的列表本身。这会导致代码中的另一个问题;当您打印(记录)时,您将获得
[[3,2,1],[3,2,1],[3,2,1],[3,2,1],[3,2,1]
作为您的输出

发生这种情况的原因是,当您调用
record.append(currentArr)
时,它实际上指向与您调用
record.append(currentArr)
的所有其他时间相同的对象引用。因此,由于所有附件都指向同一个数组,因此最终将得到同一数组的6个副本(在本例中为
currentArr
)。2d列表只是指向其他列表的指针列表

既然您已经了解了这一点,那么就更容易理解为什么您会将
[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]]作为最终输出。因为您添加到然后从这里的
currentArr
弹出
currentArr.append(optionArr[num])
在这里
currentArr.pop()
使其恢复正常, 您的
currentArr
最终版本将是您传入的版本,即
[]
。 由于
result
是一个由6个
currentArr
s组成的二维数组,因此您将得到
[]、[]、[]、[]、[]、[]、[]、[]、[]、[]
作为返回值


这可能会帮助您更好地了解它的工作方式,因为它也有图表:

如果您尝试查找所有排列,您确定[[3,2,1]、[3,2,1]、[3,2,1]、[3,2,1]、[3,2,1]、[3,2,1]、[3,2,1]]是有效的结果吗?您的权利!我可能在修改代码后复制了错误的输出。但是,让我们忽略这一点。约翰·科尔曼的答案会修正你的代码,所以你应该接受它,但看看我的答案,了解它发生的原因。
createPermutations(currentArr[:], option)
print([list(p) for p in itertools.permutations([1,2,3])])