我在 Python 3.6 上遇到了一个非常奇怪的问题。在我的代码中间,我调用了 import pdb; pdb.set_trace() 调试一些代码。
然后我无法正确调试,例如:
(Pdb) abc = 3
(Pdb) [abc for _ in range(2)]
*** NameError: name 'abc' is not defined
(Pdb) [abc, abc]
[3, 3]
似乎每当我使用列表理解时,都会出现 undefined variable 的问题。但是,如果我在打开 Python 后立即调用调试器,我不会观察到这种行为,一切运行正常。
知道我为什么会遇到这个问题吗?
请您参考如下方法:
这被归档为 b.p.o. issue #21161 , 但因“无法修复”而关闭。
根本问题正是user2357112's answer说:Comprehensions1 通过定义然后运行一个隐藏的嵌套函数来工作,但是在框架内的 pdb 中定义的函数不是真正的嵌套函数,并且不能访问框架范围内的变量。
有变通办法(其中一些在 b.p.o 问题中提到,或从该问题链接的地方),但它们都只是其中之一的巧妙变体:
(lambda abc: [abc for _ in range(2)])(abc)(换句话说,定义一个函数并显式传递局部值作为参数而不是捕获它们。 )[abc_ for abc_ in [abc] for _ in range(2)](换句话说,使用最外层可迭代对象是参数的事实。2 )[loc['abc'] for loc in [locals()] for _ in range(2)](换句话说,使用locals()['name']而不是name,并像上面一样获取本地传递。)- 在
exec中使用exec加上任何已知的同样可怕的解决方法来理解。 - 不要像 user2357112 所建议的那样使用推导式。
<子> 1。在 Python 2.x 中,这对于列表理解不是真的,只有集合和字典理解以及生成器表达式。但是 Python 3 改变了列表推导式,使它们与其他推导式保持一致。 子>
<子>
2。理解的隐藏嵌套函数捕获封闭范围内的
几乎所有名称——但最外层的可迭代对象(第一个
for 中的那个)是特殊的;它实际上是隐藏函数的参数,表达式在封闭范围内计算并作为参数值传递。
子>
