Python 在递归函数调用中保存列表

Python 在递归函数调用中保存列表,python,recursion,Python,Recursion,我正在生成给定长度的所有二进制字符串,并试图将它们存储在一个列表中,我遇到了麻烦。代码如下: def generateAllBinaryStrings(n, arr, l, i): if i == n: l.append(arr) print(arr) return arr[i] = 0 generateAllBinaryStrings(n, arr, l, i + 1) arr[i] = 1

我正在生成给定长度的所有二进制字符串,并试图将它们存储在一个列表中,我遇到了麻烦。代码如下:

def generateAllBinaryStrings(n, arr, l, i):  

    if i == n: 
        l.append(arr) 
        print(arr)
        return

    arr[i] = 0
    generateAllBinaryStrings(n, arr, l, i + 1)  

    arr[i] = 1
    generateAllBinaryStrings(n, arr, l, i + 1)  

    return l

n = 3
l = []  
arr = [None] * n 
generateAllBinaryStrings(n, arr, l, 0)  
i、 e.首先创建起始位为0的所有可能字符串,然后创建起始位为1的所有字符串。arr存储字符串,我正试图将它们附加到列表l中。以下打印结果适用于print(arr)语句,但l不正确。我能知道我哪里出错了吗

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

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

arr是Python中可变的列表。每次追加和弹出都会修改原始对象。因此,当您将arr附加到输出时,您希望保存/保留arr的瞬时状态,以便通过切片创建其副本

更正代码:

def generateAllBinaryStrings(n, arr, l, i):  

    if i == n: 
        l.append(arr[:]) 
        print(arr[:])
        return

    arr[i] = 0
    generateAllBinaryStrings(n, arr, l, i + 1)  

    arr[i] = 1
    generateAllBinaryStrings(n, arr, l, i + 1)  

    return l

n = 3
l = []  
arr = [None] * n 
generateAllBinaryStrings(n, arr, l, 0)  

arr是Python中可变的列表。每次追加和弹出都会修改原始对象。因此,当您将arr附加到输出时,您希望保存/保留arr的瞬时状态,以便通过切片创建其副本

更正代码:

def generateAllBinaryStrings(n, arr, l, i):  

    if i == n: 
        l.append(arr[:]) 
        print(arr[:])
        return

    arr[i] = 0
    generateAllBinaryStrings(n, arr, l, i + 1)  

    arr[i] = 1
    generateAllBinaryStrings(n, arr, l, i + 1)  

    return l

n = 3
l = []  
arr = [None] * n 
generateAllBinaryStrings(n, arr, l, 0)  

您有别名列表:使用
l.append(arr[:])
制作副本。更简单的方法是
list(itertools.product(*[[0,1]]*3))
。您有别名列表:使用
l.append(arr[:])
制作副本。更简单的方法是
list(itertools.product(*[0,1]*3])