gpt4 book ai didi

python - iPython 调试器引发 `NameError: name ... is not defined`

转载 作者:太空宇宙 更新时间:2023-11-03 11:40:06 25 4
gpt4 key购买 nike

我无法理解在此 Python 调试器 session 中引发的以下异常:

(Pdb) p [move for move in move_values if move[0] == max_value]
*** NameError: name 'max_value' is not defined
(Pdb) [move for move in move_values]
[(0.5, (0, 0)), (0.5, (0, 1)), (0.5, (0, 2)), (0.5, (1, 0)), (0.5, (1, 1)), (0.5, (1, 2)), (0.5, (2, 0)), (0.5, (2, 1)), (0.5, (2, 2))]
(Pdb) max_value
0.5
(Pdb) (0.5, (0, 2))[0] == max_value
True
(Pdb) [move for move in move_values if move[0] == 0.5]
[(0.5, (0, 0)), (0.5, (0, 1)), (0.5, (0, 2)), (0.5, (1, 0)), (0.5, (1, 1)), (0.5, (1, 2)), (0.5, (2, 0)), (0.5, (2, 1)), (0.5, (2, 2))]
(Pdb) [move for move in move_values if move[0] == max_value]
*** NameError: name 'max_value' is not defined

为什么它有时会告诉我 max_value 未定义,有时却没有?

顺便说一句,这是调试器启动前的代码:

max_value = max(move_values)[0]
best_moves = [move for move in move_values if move[0] == max_value]
import pdb; pdb.set_trace()

我正在使用在 PyCharm 中运行的 Python 3.6。

修改更新:

经过更多测试后,当我从 iPython REPL 或 PyCharm 中执行以下操作时,局部变量似乎在 pdb session 的列表推导中不可见:

$ ipython
Python 3.6.5 | packaged by conda-forge | (default, Apr 6 2018, 13:44:09)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import pdb; pdb.set_trace()
--Call--
> /Users/billtubbs/anaconda/envs/py36/lib/python3.6/site-packages/IPython/core/displayhook.py(247)__call__()
-> def __call__(self, result=None):
(Pdb) x = 1; [x for i in range(3)]
*** NameError: name 'x' is not defined

但是在常规的 Python REPL 中它是有效的:

$ python
Python 3.6.5 | packaged by conda-forge | (default, Apr 6 2018, 13:44:09)
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb; pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) x = 1; [x for i in range(3)]
[1, 1, 1]

我在上面测试了 3.4、3.5、3.6 版本,所以它似乎不依赖于版本。

更新 2

请注意,上面的测试('AMENDED UPDATE')是有问题的,因为它使用了import pdb;交互式 REPL 中的 pdb.set_trace()

此外,原始问题不仅限于 iPython。

参见 answer by user2357112下面是对这里发生的事情的全面解释。

抱歉,如果我造成任何混淆!

最佳答案

一个可能的解决方案/解决方法是运行

 globals().update(locals())

在 (i)pdb 中运行列表理解之前。

关于python - iPython 调试器引发 `NameError: name ... is not defined`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51164288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com