简体   繁体   English

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

[英]list returned from recursive function always empty

Im trying to return a list from a recursive function, appending to this list for each depth, but the final returned list is always empty. 我试图从递归函数返回一个列表,每个深度都追加到此列表,但是最终返回的列表始终为空。 I'm not very experienced pythonian so it might be a trivial mistake. 我不是非常有经验的pythonian,所以这可能是一个小错误。

Here's the code: 这是代码:

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); returns a list of strings, of which i grab the first if it is not empty. 返回一个字符串列表,如果不为空,我将抢占第一个。

Here's the output: 这是输出:

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


None

Any help appreciated. 任何帮助表示赞赏。

Here: 这里:

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

list.insert() (as well as all methods that modify a list in place - sort() etc) returns None . list.insert() (以及在place- sort()等中修改列表的所有方法)均返回None You want: 你要:

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

instead. 代替。

Keep in mind that you're using list functions like append , insert passing list. 请记住,您正在使用诸如appendinsert传递列表之类的列表功能。 In this case you'll end-up to weird results. 在这种情况下,您将得到奇怪的结果。 For instance 例如

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

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

Your getAllParents method takes a string and returns a list. 您的getAllParents方法采用一个字符串并返回一个列表。 Then you insert this list into another list which makes it a list of strings and lists of strings and lists... 然后将此列表插入另一个列表,该列表使它成为字符串列表以及字符串列表和列表...

To concatenate two lists you can simply use + operator, so: 要连接两个列表,您可以简单地使用+运算符,因此:

prnts = getAllParents(prnt) + parents

I don't know python but I guess the following code works fine 我不知道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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM