嵌套lis中的缩进

2024-04-25 02:25:38 发布

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

有谁能解释一下level的值是如何缩进列表项的吗。在

我已经写了密码。但是,每次递归调用fn()时,level的值都会递增吗?level的值如何在返回到外部列表中的项“8”时变为0?在

m=[1, 2, 3, [4, 5, [6, 7]], 8]
def fn(item,level):
    for each_item in item:
        if isinstance(each_item,list):
            fn(each_item,level+1)
        else:
            for tabspace in range(level):
                print("\t",end='')
            print(each_item)

代码的输出是:

^{pr2}$

Tags: in密码列表forifdefitemlevel
2条回答

您可以对函数进行一些更改:

  • level提供一个默认值0,那么在调用函数时就不必指定该值
  • 您可以重复类似这样的字符串'\t' * 3,结果是\t\t\t

像这样:

def fn(items, level=0):
    for item in items:
        if isinstance(item, list):
            fn(item, level + 1)
        else:
            indentation = '\t' * level
            print('%s%s' % (indentation, item))

你问“在外列表中打印8时level的值是如何递减到0”的,答案是:它不是简单的。在

函数的每次调用(递归与否,都无所谓)在解释器堆栈中创建一个frame实例。这个frame保存每个函数调用的局部变量值(在您的示例中,itemslevel的值。在

因此,第一个调用使用items=[1, 2, 3, [4, 5, [6, 7]], 8]level=0创建一个框架(假设您使用pacoh建议的默认值或手动传递它)。for循环开始,当它到达第四个项[4, 5, [6, 7]]时,函数将自己回调。这将在堆栈上使用items=[4, 5, [6, 7]]和{}创建一个新的frame。这个框架完全独立于调用函数的框架-第一个框架中的items和{}保持原样,并开始执行函数的代码。在

然后它到达[4, 5, [6, 7]]的第三个元素,它是一个列表并递归,从而在堆栈上用items=[6, 7]和{}创建第三个帧。第三个调用不会递归,当它完成(到达for循环的末尾)时,解释器将从堆栈中弹出顶部帧并将控件返回到前一个帧(带有items=[4, 5, [6, 7]]和{})的帧。这一个也完成了它的循环并终止,因此解释器弹出它并继续执行第一个帧,其中level仍然是仍然0。它不是“递减的”,因为它根本就没有增加过;)

相关问题 更多 >