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_NowinfNaN。这是合乎逻辑的。但是,对于特定情况,上面的代码使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,nan,inf]

代码给了我

pd_diff_ratioRMS = [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,0.2273945352145594]

该值不应以任何可能的方式存在。我对为什么会发生这种想法没有想象力。我的代码没有错误。它检查除这对pd_diff_ratioRMSmrc_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。我没有真正的想法。

再次尝试,我从np.sqrt切换到math.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.2273945352145594]

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

#pd_mrc_RMS = []
pd_mrc_RMS = [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存在问题。有想法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)