Python 存在递归时保留局部变量的当前值

Python 存在递归时保留局部变量的当前值,python,list,recursion,multidimensional-array,nested,Python,List,Recursion,Multidimensional Array,Nested,我正在编写一个函数来展平嵌套数组(Pythonlist)。e、 g将[1,2,[3]]变成[1,2,3],[1,2,[3]],4]变成[1,2,3,4]等等 我有以下资料: def flatten_array(array): flattened_array = [] for item in array: if not isinstance(item, list): flattened_array.append(item) e

我正在编写一个函数来展平嵌套数组(Python
list
)。e、 g将[1,2,[3]]变成[1,2,3],[1,2,[3]],4]变成[1,2,3,4]等等

我有以下资料:

def flatten_array(array):
    flattened_array = []
    for item in array:
        if not isinstance(item, list):
            flattened_array.append(item)
        else:
            flatten_array(item)
    return flattened_array
因此,我们的想法是让函数递归,以处理嵌套深度未知的情况。我的问题是每次遇到嵌套列表时,
flatten\u array
都会重新初始化(当递归调用
flatten\u array
时)

在进行递归调用时,如何保持展平数组的状态?

更改行

else:
    flatten_array(item)

因此,完整的函数如下所示

def flatten_array(array):
    flattened_array = []
    for item in array:
        if not isinstance(item, list):
            flattened_array.append(item)
        else:
            flattened_array+=flatten_array(item)
    return flattened_array
这给

flatten_array([1,2,[3]]) # [1,2,3]
flatten_array([1,2,[3,[4,5]]]) # [1,2,3,4,5]
flatten_array([1,2,[3,[4,5]],6,7,[8]]) # [1,2,3,4,5,6,7,8]
您的原始代码没有对递归调用执行任何操作。您可以从列表中返回结果,但只需放弃它即可。我们要做的是将其附加到现有列表的末尾


此外,如果您不想继续创建临时数组,我们可以在第一次调用该函数时创建一个数组,只需将其追加即可。†

这个版本的结果是相同的,并且可以以相同的方式使用,但是在原始版本中,每次调用函数都会创建一个新的空数组来处理。通常这不是问题,但取决于深度或子阵列在内存中的大小

此版本将数组展平为给定数组。当仅使用输入调用时(如
展平数组([1,2,[3]])
),它会创建一个空数组来处理,否则它只会添加到给定的数组中(因此递归调用只需要提供要添加的数组),并对其进行适当的修改

这样做的好处是,如果需要,您可以向现有阵列中添加:

a = [1,2,3]
b = [2,3,[4]] # we want to add flatten this to the end of a
flatten_array(b,a) # we don't bother catching the return result here
print(a) # [1,2,3,2,3,4]

这里有一个微妙之处。您可能会问为什么我们没有将函数定义为
def flatten\u array(array,flatten\u array=[])
,并了解函数内部的测试。尝试一下,然后调用函数几次。默认值在函数定义时创建一次,而不是每次调用函数时。这意味着每个函数调用都会共享就地修改的默认数组,从而使其累积结果


这可能不是我们想要的。通过将默认值设置为
None
并每次在函数中创建一个新的空数组,我们可以确保对函数的每次调用都有一个唯一的空数组来使用。

谢谢。不知道
+
运算符可用于附加到列表。@Pyderman它不完全是附加的。它将两个列表合并在一起。如果要将项目添加到列表中,需要使用append方法,但是如果有两个列表,并且希望将一个列表连接到另一个列表的末尾,则可以添加它们。请注意,如果你已经学习了很多代数,这是一个非交换加法的例子。@Matthew感谢你的额外阐述和替代解决方案。
flatten_array([1,2,[3]]) # [1,2,3]
flatten_array([1,2,[3,[4,5]]]) # [1,2,3,4,5]
flatten_array([1,2,[3,[4,5]],6,7,[8]]) # [1,2,3,4,5,6,7,8]
def flatten_array(array,flattened_array=None):
    if flattened_array is None:
        flattened_array = []
    for item in array:
        if not isinstance(item,list):
            flattened_array.append(item)
        else:
            flatten_array(item,flattened_array)
    return flattened_array
a = [1,2,3]
b = [2,3,[4]] # we want to add flatten this to the end of a
flatten_array(b,a) # we don't bother catching the return result here
print(a) # [1,2,3,2,3,4]