嵌套列表中的缩进

时间:2017-10-05 07:04:49

标签: python

任何人都可以解释一下水平值是如何缩进列表项的。

我写了代码。但是,每次fn()被递归调用时,级别的值是否会增加?当它回到外部列表中的项目'8'时,level的值如何变为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)

代码的输出是:

1
2
3
    4
    5
        6
        7
8

2 个答案:

答案 0 :(得分:1)

您可以对您的功能进行一些更改:

  • 将默认值0设为level,然后在调用该函数时不必指定值
  • 您可以重复此'\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))

答案 1 :(得分:0)

你问“在外部列表中打印8时,级别的值如何减少到0”,答案是:它不是。简单明了。

函数的每次调用(递归与否,无关紧要)都会在解释器堆栈中创建frame实例。此frame包含每个函数调用的局部变量值(在您的示例中为itemslevel的值。

因此,第一个调用会创建一个包含items=[1, 2, 3, [4, 5, [6, 7]], 8]level=0的框架(假设您使用了Paco H建议的默认值或手动传递)。 for循环开始,当它到达第四个项[4, 5, [6, 7]]时,该函数会自行调用。这会在堆栈中使用frameitems=[4, 5, [6, 7]]创建新的level=1。这个帧与调用者函数的帧完全独立 - 第一帧中的itemslevel保持原样 - 并开始执行函数的代码。

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