Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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 3.x Python3递归,for循环,函数返回奇怪的输出_Python 3.x_List_Recursion_Return - Fatal编程技术网

Python 3.x Python3递归,for循环,函数返回奇怪的输出

Python 3.x Python3递归,for循环,函数返回奇怪的输出,python-3.x,list,recursion,return,Python 3.x,List,Recursion,Return,我的函数组合(ary,p)用于返回列表中项目顺序的所有可能的组合。 但它总是多次返回第一个值,即使它找到了所有可能的订单,我知道这是因为它打印了它们。 编辑:我想让它工作我自己,学习一些东西,而不是使用任何外部库。 最后一个列表可以包含所有可能的订单,但它只有输入值顺序,即使它打印每个订单。那么我把返回的放在哪里了?你的问题是只有一份ary。您多次将其附加到bary。所以巴里也有同样的一张单子。任何时候你改变方向。这将反映在所有的列表中,因为它们都是相同的列表 相反,当您附加到bary时,

我的函数
组合(ary,p)
用于
返回列表中项目顺序的所有可能的组合。
但它总是多次返回第一个值,即使它找到了所有可能的订单,我知道这是因为它打印了它们。

编辑:我想让它工作我自己,学习一些东西,而不是使用任何外部库。



最后一个列表可以包含所有可能的订单,但它只有输入值顺序,即使它打印每个订单。那么我把
返回的
放在哪里了?

你的问题是只有一份ary。您多次将其附加到bary。所以巴里也有同样的一张单子。任何时候你改变方向。这将反映在所有的列表中,因为它们都是相同的列表

相反,当您附加到bary时,请指定ary的一个副本,但将其作为自己的新列表,以便在更改ary时不会受到影响

def组合(ary,p):
ln=len(ary)
巴里=[]
对于范围内的a(ln-p):
如果p=ln-2:
追加(ary[:])#将此行更改为获取ary的浅拷贝
打印('ary',ary',bary',bary)
ary.append(ary.pop(p))
返回酒吧
打印(组合([7,3,2],0))
输出

ary [7, 3, 2] bary [[7, 3, 2]]
ary [7, 2, 3] bary [[7, 3, 2], [7, 2, 3]]
ary [3, 2, 7] bary [[3, 2, 7]]
ary [3, 7, 2] bary [[3, 2, 7], [3, 7, 2]]
ary [2, 7, 3] bary [[2, 7, 3]]
ary [2, 3, 7] bary [[2, 7, 3], [2, 3, 7]]
[[7, 3, 2], [7, 2, 3], [3, 2, 7], [3, 7, 2], [2, 7, 3], [2, 3, 7]]

为什么不在这里使用itertools
print(list(itertools.permutations([7,3,2]))
如果我无法修复它,我最终不得不修复它,但我不会学到任何东西,我更愿意自己尽可能多地制作它。也许可以补充一点,
bary
中充满了对
ary
的引用?非常感谢,我从来没有想到会发生这样的事情。我本来会给你投票的,但我没有足够的分数。
def combinations(ary, p):
    ln = len(ary)
    bary=[]
    for a in range(ln-p):
        if p<ln-2:
            bb = combinations(ary, p+1)
            for be in bb:
                bary.append(be)
        if p>=ln-2:

    -->     bary.append(ary)
    -->     print('ary', ary, 'bary', bary)

        ary.append(ary.pop(p))
    return bary
##  There is clearly every possible combination:
##
##      ||
##      ||
        \/
ary [7, 3, 2] bary [[7, 3, 2]]
ary [7, 2, 3] bary [[7, 2, 3], [7, 2, 3]]
ary [3, 2, 7] bary [[3, 2, 7]]
ary [3, 7, 2] bary [[3, 7, 2], [3, 7, 2]]
ary [2, 7, 3] bary [[2, 7, 3]]
ary [2, 3, 7] bary [[2, 3, 7], [2, 3, 7]]
[[7, 3, 2], [7, 3, 2], [7, 3, 2], [7, 3, 2], [7, 3, 2], [7, 3, 2]]
ary [7, 3, 2] bary [[7, 3, 2]]
ary [7, 2, 3] bary [[7, 3, 2], [7, 2, 3]]
ary [3, 2, 7] bary [[3, 2, 7]]
ary [3, 7, 2] bary [[3, 2, 7], [3, 7, 2]]
ary [2, 7, 3] bary [[2, 7, 3]]
ary [2, 3, 7] bary [[2, 7, 3], [2, 3, 7]]
[[7, 3, 2], [7, 2, 3], [3, 2, 7], [3, 7, 2], [2, 7, 3], [2, 3, 7]]