递归函数返回的列表始终为空

时间:2018-08-17 07:26:01

标签: python pymel

我正在尝试从递归函数返回一个列表,并为每个深度追加到此列表,但是最终返回的列表始终为空。 我不是经验丰富的pythonian,所以这可能是一个小错误。

代码如下:

import pymel.core as pm

def getParent(jnt):
    something = pm.listRelatives(jnt, parent=True);
    if something:
        print 'got parent: ' + something[0]
        return something[0]
    else:
        return None

def getAllParents(jnt):
    parents = []
    parents.append(jnt)
    prnt = getParent(jnt)
    if prnt == None:
        return parents
    else:
        prnts = parents.insert(0, getAllParents(prnt))
        return prnts


selection = pm.ls(sl=True)[0]

parents = getAllParents(selection)

print '\n'
print parents

pm.listRelatives(jnt, parent=True);返回一个字符串列表,如果字符串不为空,我将抓住其中的第一个。

以下是输出:

got parent: joint3
got parent: joint2
got parent: joint1


None

任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:2)

这里:

def getAllParents(jnt):
    # ...
    prnts = parents.insert(0, getAllParents(prnt))
    return prnts

list.insert()(以及在适当位置修改列表的所有方法-sort()等)返回None。您想要:

    parents.insert(0, getAllParents(prnt))
    return parents

相反。

答案 1 :(得分:1)

请记住,您正在使用列表功能,例如appendinsert传递列表。在这种情况下,您将得到奇怪的结果。 例如

a = [1, 2, 3]
b = [4, 5]
print(a.append(b))

>> [1, 2, 3, [4, 5]]

答案 2 :(得分:1)

您的getAllParents方法采用一个字符串并返回一个列表。然后,将此列表插入另一个列表,该列表使它成为字符串列表以及字符串列表和列表...

要串联两个列表,您可以简单地使用+运算符,因此:

prnts = getAllParents(prnt) + parents

答案 3 :(得分:0)

我不了解python,但是我猜下面的代码可以正常工作

listPrts = ["","toto","idiot","happy"]

def getParent(jnt):
    something = listPrts
    del listPrts[0]
    if something:
        print 'got parent: ' + something[0]
        return something[0]
    else:
        return None

def getAllParents(jnt):
    parents = []
    parents.append(jnt)
    prnt = getParent(jnt)
        if prnt == None:
            return parents
        else:
            prnts = parents.insert(0, getAllParents(prnt))
            return parents


selection = "childof"

parents = getAllParents(selection)

print '\n'
print parents