Python 3.x 列表理解中的if子句在pdb中给出了未定义的名称错误,但在解释器中没有给出

Python 3.x 列表理解中的if子句在pdb中给出了未定义的名称错误,但在解释器中没有给出,python-3.x,pdb,Python 3.x,Pdb,很抱歉这个糟糕的标题。我必须弄清楚术语,并试图把所有相关的观点都放在那里 考虑Python中的以下简单交互: Python 3.6.9 (default, Jul 21 2019, 14:33:59) [GCC 7.4.0] on cygwin Type "help", "copyright", "credits" or "license" for more information. >>> python.el: native completion setup loaded

很抱歉这个糟糕的标题。我必须弄清楚术语,并试图把所有相关的观点都放在那里

考虑Python中的以下简单交互:

Python 3.6.9 (default, Jul 21 2019, 14:33:59) 
[GCC 7.4.0] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> python.el: native completion setup loaded
>>> s1 = [ i for i in range(10)]
>>> [i for i in range(len(s1)) if s1[i]%2 == 0]
[0, 2, 4, 6, 8]
最后一条语句创建(并打印)原始数组s1中偶数元素的索引

但在pdb中,等效项不起作用:

(Pdb) !s1 = [ i for i in range(10)]
(Pdb) s1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
(Pdb) ![i for i in range(len(s1)) if s1[i]%2 == 0]
*** NameError: name 's1' is not defined

为什么s1在python解释器的作用域中,而不在调试器中?我试图识别数组中满足某些条件的元素。python在调试器中是如何做到这一点的?

就像其他人提到的那样,您的代码应该可以工作。然而,不久前我遇到了一个类似的问题,当时我试图在列表理解中使用一个变量,就像你一样,我发现锑的回答非常有用:

在Python3中,由于理解实现方式的改变,在访问任何非全局变量之前,必须在pdb中使用interact命令


在pdb中尝试了您的代码,效果非常好。您使用的是什么python版本?请您解释一下为什么要使用
!s1
在Pdb中?这应该可以正常工作。您使用的是哪个操作系统和Python版本?嗯。我的问题包括复制粘贴我的交互,但今天我无法复制。我已经排除了这是因为我在python中使用了
cygwin
或者在
emacs
中使用了它的可能性,因为它们现在都在工作。一定是我的使用错误。@thishri我习惯使用
,因为输入的任何字符串
pdb>
提示符首先作为调试器命令执行。例如,如果您有一个名为
step
的变量,则输入命令
step=5
不会分配给该变量,而是分配给下一行代码。搜索
这是最肯定发生的事情。我有几乎完全相同的代码来启动带有函数的调试器,实际上我在调试器中执行的代码是从源代码复制的。我甚至都不知道互动
,谢谢。很遗憾,在赏金到期之前我没有看到这个,但我会处理好的。