我在玩inspect
模块,注意到当我使用列表理解时,堆栈有一个额外的层
这里有一个基本的例子。我希望两个print函数调用都提供相同的堆栈引用(到第19行和第20行),但是print(get_list_comprehension())
返回到第16行get_list_comprehension
中的的堆栈引用。列表理解似乎有效地为堆栈添加了一个框架
与手动创建列表相比,为什么会出现这种情况
from inspect import getframeinfo, stack
def get_traceback(depth=2):
return getframeinfo(stack()[depth][0])
def get_list():
tracebacks = []
for i in range(1):
tracebacks.append(get_traceback())
return tracebacks[0]
def get_list_comprehension():
return [get_traceback() for _ in range(1)][0]
print(get_list())
print(get_list_comprehension())
# Traceback(filename='stack.py', lineno=19, function='<module>', code_context=['print(get_list())\n'], index=0)
# Traceback(filename='stack.py', lineno=16, function='get_list_comprehension', code_context=[' return [get_traceback() for _ in range(1)][0]\n'], index=0)
嗯,因为它是。扩展列表理解是在内部函数中完成的。如果将
get_traceback
的内容替换为assert 0
,您将看到:因为列表理解是使用函数实现的。您可以使用disassembler看到这一点:
因此,在不理解列表的情况下:
通过列表理解:
相关问题 更多 >
编程相关推荐