python - 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
可能是inf
或NaN
将导致pd_mrc_RMS_now
或inf
同样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.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.sqrt
或np.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 存在问题。任何想法?
解决方案
推荐阅读
- xaml - xaml 中的进度环不会阻止游戏手柄控制器动作?
- android - 使用带有 Firestore 的 collection.add() 应用程序崩溃
- c# - Azure 函数中没有 GetQueryNameValuePairs 的定义
- hive - 优化 Hive 查询从两个分区请求数据
- c++ - 使用 Visual C++ 在控制台中的文件浏览器
- sql - 如果列与 PostgreSQL 匹配,则使用另一个表中的数据更新表的列
- react-native - react-native-maps 带有子组件的错误不断移动位置?
- react-native - React Native - 分离视图和逻辑
- java - 使用 Java 8 流和收集器嵌套值
- curl - PlaylistItems: 列表返回 playlistNotFound