首页 > 解决方案 > PyCharm 给出奇怪的结果,是内存/指针问题吗?

问题描述

我在 PyCharm 中有一些 Python 代码如下:

pd_mrc_RMS = []
for i in range(len(pd_diff_ratioRMS)):
    mrc_now = mrc_diff_ratioRMS[i]
    pd_now = pd_diff_ratioRMS[i]
    pd_mrc_RMS_now = np.sqrt(mrc_now**2 + pd_now**2)
    pd_mrc_RMS.append(pd_mrc_RMS_now)

我注意到有时,mrc_now和/或pd_now可能是infNaN将导致pd_mrc_RMS_nowinf同样NaN。这是合乎逻辑的。但是对于特定情况,上面的代码导致 的最后pd_mrc_RMS一个值是pd_diff_ratioRMS. 我哪里没有这样的命令。我只追加到数组pd_mrc_RMS_now中,这是计算出来的pd_now。为了澄清事情,在这种情况下,其他数组的值是:

pd_diff_ratioRMS = [inf,
                    0.7343642741825436,
                    0.7102599599923878,
                    0.22130907979104325,
                    0.01582110950187491,
                    0.4487684369819055,
                    0.07653438892240305,
                    0.2273945352145594]
mrc_diff_ratioRMS = [inf,
                     inf,
                     inf,
                     nan,
                     inf,
                     inf,
                     inf,
                     inf]

代码给了我:

pd_diff_ratioRMS = [inf,
                    inf,
                    inf,
                    nan,
                    inf,
                    inf,
                    inf,
                    0.2273945352145594]

我把代码改成这样,希望能避免奇怪的现象:

pd_mrc_RMS = []
for i in range(len(pd_diff_ratioRMS)):
    mrc_now = mrc_diff_ratioRMS[i]
    pd_now = pd_diff_ratioRMS[i]
    cond1 = float('-inf') < mrc_now < float('inf')
    cond2 = float('-inf') < pd_now < float('inf')
    pd_mrc_RMS_now = 0.
    if cond1 and cond2:
        pd_mrc_RMS_now = np.sqrt(mrc_now**2 + pd_now**2)
    else:
        pd_mrc_RMS_now = float('inf')
    pd_mrc_RMS.append(pd_mrc_RMS_now)

问题仍然没有消失。然后我把它改成我认为万无一失的东西:

pd_mrc_RMS = []
for i in range(len(pd_diff_ratioRMS)):
    mrc_now = mrc_diff_ratioRMS[i]
    pd_now = pd_diff_ratioRMS[i]
    cond1 = float('-inf') < mrc_now < float('inf')
    cond2 = float('-inf') < pd_now < float('inf')
    pd_mrc_RMS_now = 0.
    if cond1 and cond2:
        pd_mrc_RMS_now = np.sqrt(mrc_now**2 + pd_now**2)
        pd_mrc_RMS.append(pd_mrc_RMS_now)
    else:
        pd_mrc_RMS_now = float('inf')
        pd_mrc_RMS.append(1.0)

令我恐惧的是,这是它给我的结果:

pd_diff_ratioRMS = [1.0,
                    1.0,
                    1.0,
                    1.0,
                    1.0,
                    1.0,
                    1.0,
                    0.2273945352145594]

该值不应该以任何可能的方式存在。我对为什么会发生这种情况已经没有想象力了。我的代码中没有错误。它检查除这对pd_diff_ratioRMS和之外的所有其他情况mrc_diff_ratioRMS。任何指针将不胜感激。

==================================================== =========================

为了暴力破解解决方案,在上面的代码之后添加了以下代码:

# fixing strange issue
for i in range(len(pd_mrc_RMS)):
    mrc_now = mrc_diff_ratioRMS[i]
    pd_now = pd_diff_ratioRMS[i]
    cond1 = not(float('-inf') < mrc_now < float('inf'))
    cond2 = not(float('-inf') < pd_now < float('inf'))
    if cond1 or cond2:
        pd_mrc_RMS[i] = float('inf')
pd_mrc_RMS[7] = 1.0

令我大吃一惊的是,pd_mrc_RMS[7]顽固地留在了0.2273945352145594. 我真的没有想法了。

在另一次尝试中,我从 to 切换np.sqrtmath.sqrt,问题仍然存在。

这些是我用于代码的导入,我使用的是 Python 3.8:

from PIL import Image
from PIL import ImageChops
import numpy as np
import math

对于那些希望重现该问题的人,我使用的是 Python 3.8.0。我在另一个文件中使用此代码,但仍然遇到相同的问题(math.sqrtnp.sqrt):

import numpy as np
import math

pd_diff_ratioRMS = [float('inf'),
                    0.7343642741825436,
                    0.7102599599923878,
                    0.22130907979104325,
                    0.01582110950187491,
                    0.4487684369819055,
                    0.07653438892240305,
                    0.2273945352145594]

mrc_diff_ratioRMS = [float('inf'),
                     float('inf'),
                     float('inf'),
                     float('NaN'),
                     float('inf'),
                     float('inf'),
                     float('inf'),
                     float('inf')]

#pd_mrc_RMS = []
pd_mrc_RMS = [1., 1., 1., 1., 1., 1., 1., 1.]
for i in range(len(pd_diff_ratioRMS)):
    mrc_now = mrc_diff_ratioRMS[i]
    pd_now = pd_diff_ratioRMS[i]
    #pd_mrc_RMS_now = np.sqrt(mrc_now ** 2 + pd_now ** 2)
    pd_mrc_RMS_now = math.sqrt(mrc_now ** 2 + pd_now ** 2)
    #pd_mrc_RMS.append(pd_mrc_RMS_now)
    pd_mrc_RMS[i] = pd_mrc_RMS_now
pd_mrc_RMS[7] = 1.0
pd_mrc_RMS[7] = 2.0
pd_mrc_RMS[7] = 3.0

到目前为止,我唯一没有做的就是重置我的电脑。但是在另一个文件上再次看到它告诉我它不会。从追加切换到分配仍然不起作用。之后的直接分配也无济于事。切换 Python 版本也无济于事。

在新项目中运行上面的代码显示没有错误。 0.2273945352145594永远不会按预期附加到数组中。我强烈怀疑 PyCharm 存在问题。任何想法?

标签: pythonpointerspycharm

解决方案


推荐阅读