Python调试器无法识别定义的变量

问题描述

我正在尝试使用Python的调试模块pdb查看列表理解调用的结果。但是,pdb“环境”同时声称已定义了一个变量,并且未定义该变量,从而导致pdb同意定义的变量的NameError。以下是重复此问题的最小代码示例:

import pdb
        
def main():
    bar = [0,1,1]
    foo(bar)
        
def foo(bar):
    pdb.set_trace()

    ### pdb COMMANDS LISTED BELOW ARE CALLED HERE ###

    print([False if bar[i] == 0 else True for i in range(len(bar))])
        
main()

在上述代码执行点运行以下pdb命令会导致以下结果。

(Pdb) p bar
[0,1]
(Pdb) p [False if bar[i] == 0 else True for i in range(len(bar))]
*** NameError: name 'bar' is not defined
(Pdb) !print([False if bar[i] == 0 else True for i in range(len(bar))])
*** NameError: name 'bar' is not defined
(Pdb) n
[False,False,True,True]

此外,在没有pdb模块的情况下运行代码会产生预期的结果。将pdb.set_trace()方法调用的位置更改为main函数对结果没有影响。我需要做什么才能调试此列表理解调用

解决方法

您偶然发现了pdb中的错误! pdb的{​​{1}}命令不是一个功能全面的交互式解释器,可能难以找到直观上应该容易找到但并非出于底层原因的变量CPython实现。特别是,它经常无法在闭包和列表理解中做到这一点。 Here's a bug report

该错误报告确实提到了一种解决方法。输入print,您将获得一个完整的交互式python shell,您应该可以在其中评估列表理解:

interact

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...