为什么在调试和运行中有不同的行为?Pycharm+ 当地人

Why different behavior in debug and run? Pycharm+ locals

提问人:Kazarin V. 提问时间:11/8/2023 更新时间:11/8/2023 访问量:28

问:

我有这个代码:

import ctypes
import inspect


def fun():
    c = 3
    inspect.currentframe().f_locals['c'] = 4
    ctypes.pythonapi.PyFrame_LocalsToFast(ctypes.py_object(inspect.currentframe()), ctypes.c_int(0))
    print(c)


fun()

如果“运行”,则输出将为:>>> 4

但是带有“Debug”和“print(c)”上的断点。 通过调用控制台的“print(c)”,输出将如下所示:>>> 3

为什么有不同的行为?这可以解决吗?

使用 PyDev 控制台 pycharm

python pycharm pydev 局部变量

评论

0赞 chepner 11/8/2023
在猜测中,调试器以与模块工作方式不兼容的方式处理调用堆栈。(Python 本身甚至不需要对堆栈帧的支持,因此假设您的赋值更改了局部变量的值,这依赖于一些未定义的行为。inspectc
0赞 JonSG 11/8/2023
我无法使用 VScode 调试器复制这一点。
0赞 Barmar 11/8/2023
这可能与 IDE 检测代码以支持调试的方式有关。它可能会以意想不到的方式影响堆栈帧。inspect

答:

1赞 Kazarin V. 11/8/2023 #1

就我而言,它的工作原理如下:

import ctypes
import inspect


def fun():
    c = 3
    ctypes.pythonapi.PyFrame_FastToLocals(ctypes.py_object(inspect.currentframe()))
    inspect.currentframe().f_locals['c'] = 4
    ctypes.pythonapi.PyFrame_LocalsToFast(ctypes.py_object(inspect.currentframe()), ctypes.c_int(0))
    print(c)


fun()

评论

0赞 Community 11/8/2023
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。