【发布时间】:2021-04-08 23:52:02
【问题描述】:
我在玩inspect 模块,并注意到当我使用列表理解时堆栈有一个额外的层。
这是一个基本示例。我希望两个打印函数调用都提供相同的堆栈引用(第 19 行和第 20 行),但 print(get_list_comprehension()) 在第 16 行返回对 inside 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)
【问题讨论】:
-
因为列表推导是通过函数实现的。
标签: python list-comprehension stack-trace