Python PyCharm给出了奇怪的结果,这是内存/指针问题吗?

Python PyCharm给出了奇怪的结果,这是内存/指针问题吗?,python,pointers,pycharm,Python,Pointers,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) 我注意到,有时

我在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\u now
和/或
pd\u now
可以是
inf
NaN
,这将导致
pd\u mrc\u RMS\u now
成为
inf
NaN
。这是合乎逻辑的。然而,对于特定情况,上述代码导致
pd\u mrc\u RMS
的最后一个值为
pd\u diff\u ratiors
中的最后一个值。我在任何地方都没有这样的命令。我只在数组中添加了
pd\u mrc\u RMS\u now
,该数组是根据
pd\u 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_diff_ratioRMS = [1.0,
                    1.0,
                    1.0,
                    1.0,
                    1.0,
                    1.0,
                    1.0,
                    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_diff_比率
mrc_diff_比率
之外的所有其他情况。任何指示都将不胜感激

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

在我尝试暴力解决方案时,在上述代码之后添加了以下代码:

# 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
对于那些希望重现这个问题的人,我使用的是Python 3.8.0。我在另一个文件中使用了此代码,但仍然看到了相同的问题(
math.sqrt
np.sqrt
):

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


在新项目中运行上述代码不会显示错误
0.22739453525594
从未按预期添加到数组中。我强烈怀疑PyCharm有问题。有什么想法吗?

np.sqrt
返回一个可变对象。如果这个可变对象发生了变异,那么这个变化将反映在它所包含的任何地方。我不知道这段代码在哪里发生了这样的突变,但我敢打赌。@Carcigenicate,既然你提到了它,所有的
1.0
都是
float
,奇怪的值是
float64
。谜团只会加深。这可以通过
打印(id(pd_mrc_RMS[-1])、id(pd_diff_ratiors[-1])
来验证。在这个问题案例中,如果这两个数字匹配,我是对的。我将这一行放在第一个代码和第二个代码之后(暴力修复)。这些是他们给出的值:140701133279024 140701133278608/140701694304816 140701133278608。您知道为什么
pd\u mrc\u RMS[-1]
的值会发生变化吗?
# 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
from PIL import Image
from PIL import ImageChops
import numpy as np
import math
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