任何人都可以解释一下水平值是如何缩进列表项的。
我写了代码。但是,每次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
答案 0 :(得分:1)
您可以对您的功能进行一些更改:
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
包含每个函数调用的局部变量值(在您的示例中为items
和level
的值。
因此,第一个调用会创建一个包含items=[1, 2, 3, [4, 5, [6, 7]], 8]
和level=0
的框架(假设您使用了Paco H建议的默认值或手动传递)。 for循环开始,当它到达第四个项[4, 5, [6, 7]]
时,该函数会自行调用。这会在堆栈中使用frame
和items=[4, 5, [6, 7]]
创建新的level=1
。这个帧与调用者函数的帧完全独立 - 第一帧中的items
和level
保持原样 - 并开始执行函数的代码。
然后它到达[4, 5, [6, 7]]
的第三个元素,它是一个列表并递归,从而在堆栈上创建第三个框架items=[6, 7]
和level=2
。第三个调用不会递归,当它完成时(到达for循环的末尾),解释器会弹出堆栈中的顶部框架并将控件返回到前一个框架(具有items=[4, 5, [6, 7]]
和{{{ 1}})。这个也完成它的循环并终止,所以解释器弹出它并继续执行第一帧,其中level=1
仍然 level
。它不会“递减”,因为它根本没有增加;)