首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python调试器中的所有变量均未定义

python调试器中的所有变量均未定义
EN

Stack Overflow用户
提问于 2018-01-11 06:46:06
回答 3查看 1.6K关注 0票数 2

我在Python3.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]

似乎每当我使用列表理解时,都会出现变量未定义的问题。但是,如果我在打开Python之后立即调用调试器,我没有观察到这种行为,一切都运行得很好。

你知道为什么我会有这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-11 07:03:14

这是因为列表理解(主要)是在嵌套作用域中计算的,而在pdb中创建的嵌套作用域不能访问被检查作用域的局部变量。但是,它们可以访问全局变量,并且当您在打开Python之后立即启动pdb时,您是在全局范围内运行它,因此您创建的abc是全局的。

exec和类语句中的列表理解中也会发生这种情况。不幸的是,没有比“不使用列表解释”更好的变通方法了。

票数 5
EN

Stack Overflow用户

发布于 2018-11-03 05:32:26

您可以尝试以下代码:

(Pdb) !import code; code.interact(local=vars())
Python 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 17:14:51) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> [abc for _ in range(2)]

使用Ctrl-D返回到常规pdb提示符。

票数 5
EN

Stack Overflow用户

发布于 2019-05-11 02:54:18

与李盘峰的答案类似,但更简单的方法是在pdb中使用interact

下面是pdb故障和interact在同一上下文中工作的示例。

Python 3.6.3 (default, Oct  4 2017, 06:09:05)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def do_comp():
...   abc = 3
...   import pdb; pdb.set_trace()
...
>>> do_comp()
--Return--
> <stdin>(3)do_comp()->None
(Pdb) [abc for _ in range(2)]
*** NameError: name 'abc' is not defined
(Pdb) interact
*interactive*
>>> [abc for _ in range(2)]
[3, 3]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48197324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档