Python递归列表(pop vs [])

时间:2015-04-11 11:01:56

标签: python list recursion

我正在进行递归,我遇到了一个问题,我已经解决但我想知道发生了什么以及为什么我先尝试的方法不起作用。我唯一的问题是当listOfX长度为3时清空它。

以下是原始代码无法正常工作:

sol = []
def recLoop(levelWidth,levelOn,listOfX):
    if len(listOfX) == 3:
        sol.append([listOfX[0],listOfX[1]])
        sol.append([listOfX[0],listOfX[2]])
        listOfX = []     #THIS DOES NOT WORK

    print listOfX
    if len(levelWidth) != levelOn: 
        for x in range(levelWidth[levelOn]):
            listOfX.append(x)
            recLoop(levelWidth,levelOn+1,listOfX)

recLoop([3,2],0,[])
print sol

然而,当我使用pop()代替时,它会按预期工作:

sol = []
def recLoop(levelWidth,levelOn,listOfX):
    if len(listOfX) == 3:
        sol.append([listOfX[0],listOfX[1]])
        sol.append([listOfX[0],listOfX[2]])
        listOfX.pop()
        listOfX.pop()
        listOfX.pop()

    print listOfX
    if len(levelWidth) != levelOn: 
        for x in range(levelWidth[levelOn]):
            listOfX.append(x)
            recLoop(levelWidth,levelOn+1,listOfX)

recLoop([3,2],0,[])
print sol

注意:第一个代码的结果是:

[[0, 0], [0, 1]]

但它应该是:

[[0, 0], [0, 1], [1, 0], [1, 1], [2, 0], [2, 1]]

1 个答案:

答案 0 :(得分:4)

声明:

listOfX = []

只需将局部变量(只是对象的引用)重新绑定到新列表。原始列表对象仍在其他地方引用,但不受此重新绑定的影响。另一方面,使用listOfX.pop()直接操纵该对象。

您可以使用:

listOfX[:] = []

清除列表,而不是。