递归时保持局部变量的当前值

2024-10-03 02:33:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个函数来展平嵌套数组(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)
        else:
            flatten_array(item)
    return flattened_array

因此,我们的想法是让函数递归,以处理嵌套到未知深度的情况。我的问题是每次遇到嵌套列表时flattened_array都会被重新初始化(当flatten_array被递归调用时)。你知道吗

print flatten_array([1,2,[3]])
[1,2]

当进行递归调用时,如何保持flattened_array的状态?你知道吗


Tags: 函数inforifdefnot数组item
1条回答
网友
1楼 · 发布于 2024-10-03 02:33:10

换行

else:
    flatten_array(item)

else:
    flattened_array+=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]

您的原始代码没有对递归调用执行任何操作。你可以从列表中得到结果,但是你可以放弃它。我们要做的是将其附加到现有列表的末尾。你知道吗


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

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

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

此版本将数组展平为给定的数组。当只使用输入调用时(如flatten_array([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_array(array,flattened_array=[]),并了解函数内部的测试。尝试一下,然后调用函数几次。默认值只在函数定义时创建一次,而不是每次调用函数时创建一次。这意味着每个函数调用都会共享就地修改的默认数组,从而使其累积结果。

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

相关问题 更多 >