Python 存在递归时保留局部变量的当前值
我正在编写一个函数来展平嵌套数组(PythonPython 存在递归时保留局部变量的当前值,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
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]