有谁能解释一下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}$
您可以对函数进行一些更改:
level
提供一个默认值0,那么在调用函数时就不必指定该值'\t' * 3
,结果是\t\t\t
像这样:
你问“在外列表中打印8时level的值是如何递减到0”的,答案是:它不是简单的。在
函数的每次调用(递归与否,都无所谓)在解释器堆栈中创建一个
frame
实例。这个frame
保存每个函数调用的局部变量值(在您的示例中,items
和level
的值。在因此,第一个调用使用}创建一个新的}保持原样,并开始执行函数的代码。在
items=[1, 2, 3, [4, 5, [6, 7]], 8]
和level=0
创建一个框架(假设您使用pacoh建议的默认值或手动传递它)。for循环开始,当它到达第四个项[4, 5, [6, 7]]
时,函数将自己回调。这将在堆栈上使用items=[4, 5, [6, 7]]
和{frame
。这个框架完全独立于调用函数的框架-第一个框架中的items
和{然后它到达}创建第三个帧。第三个调用不会递归,当它完成(到达for循环的末尾)时,解释器将从堆栈中弹出顶部帧并将控件返回到前一个帧(带有})的帧。这一个也完成了它的循环并终止,因此解释器弹出它并继续执行第一个帧,其中
[4, 5, [6, 7]]
的第三个元素,它是一个列表并递归,从而在堆栈上用items=[6, 7]
和{items=[4, 5, [6, 7]]
和{level
仍然是仍然0
。它不是“递减的”,因为它根本就没有增加过;)相关问题 更多 >
编程相关推荐