为空列表放置变量如何改变此 python 代码?

How does putting the variable for empty list alter this python code?

我正在尝试编写代码以使用递归展平任何嵌套列表。这是我写的第一个代码:

def flatten(NL):
    a = []
    for i in NL:
        if type(i) == int:
            a.append(i)
        elif type(i) == list:
            flatten(i)
    return a

但是,它一直返回一个空列表,直到我更改代码并将变量 "a" 放在函数之外:

a = []
def flatten(NL):
    for i in NL:
        if type(i) == int:
            a.append(i)
        elif type(i) == list:
            flatten(i)
    return a

我试图围绕它思考但无济于事。将空列表放在函数之外有何影响?

当你把 a 放在函数外面时,你总是在修改同一个 a,但是当你把它放在里面时,你每次都在重新定义 a。由于您只是说 flatten(i),而您实际上并未对扁平化版本执行任何操作,因此 a 不受扁平化的影响。您需要将扁平化版本添加到 a:

def flatten(NL):
    a = []
    for i in NL:
        if type(i) == int:
            a.append(i)
        elif type(i) == list:
            a += flatten(i) # Here we add the flattened version to a instead of just creating it.
    return a

如果您打算使用递归,那么您还需要 "double dipping" 一个 for 循环。

对于列表的递归操作,在头部进行操作,在尾部进行递归。根本不需要声明自己的列表,这只会增加难度。

def flatten(NL):
    if type(NL) == list:
        if not NL:
            return NL    #empty list terminate recursion
        return flatten(NL[0]) + flatten(NL[1:])
    return [NL]     #'scalar' value terminate recursion

这是一个例子

>>> flatten([[1,2],[3,[4,5]],[6,7]])
[1, 2, 3, 4, 5, 6, 7]