Python PyCharm给出了奇怪的结果,这是内存/指针问题吗?
我在PyCharm中有一些Python代码,如下所示: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) 我注意到,有时
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