Skip to main content
 首页 » 编程设计

python之python 调试器中的所有变量都未定义

2025年05月04日10zdz8207

我在 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 中的那个)是特殊的;它实际上是隐藏函数的参数,表达式在封闭范围内计算并作为参数值传递。