DEBUG.WIKI
晚安云;香港 CN2 ¥15/月
PanstarCloud:部署应用,接入 AI,云服务器与 AI 网关
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →

SciPy 自然动量单位仍返回旧值:检查 CODATA 别名覆盖

SciPy 1.18.1 中两个自然动量常量可能被旧别名覆盖。核对具体键名、单位与数据年代,按同一套常量计算电子质量乘光速。

physical_constants["natural unit of momentum"] 与 m_e * c 的结果不一致,而且差异超出了显示位数。这种情况下,先核对常量所属的数据版本和具体键名,不要用一个任意放宽的比较容差把差异掩盖。

SciPy 1.18.1 的两个条目存在明确的旧数据覆盖路径:natural unit of momentum 和 natural unit of momentum in MeV/c。正式常量表已有 CODATA 2022 的数据,但插入别名时可能把旧的 mom.um 条目反向写到新名称上,留下 CODATA 2014 的数值。这不代表整个 scipy.constants 都退回了旧数据。

同时看数值、单位和不确定度

常量字典的值是三元组,分别为数值、单位和绝对不确定度。下面是定位这两个具体条目的读取示例:

from scipy import constants as c

for key in (
    "natural unit of momentum",
    "natural unit of momentum in MeV/c",
):
    print(key, c.physical_constants[key])

print("electron mass times c:", c.m_e * c.c)

受影响数据中,SI 动量条目可显示 2.730924488e-22,而 m_e * c 约为 2.73092453445525e-22。这两个值的差异虽小,常量数据有明确的年代和不确定度,仍不能把它当成随意舍入。MeV/c 和 kg m s^-1 也不能不换单位便直接比较。

读取一个不存在或历史名称的条目出现 KeyError、弃用提示,是另一种情形。不要为了避免异常,静默换成拼写相近的旧键。

需要 SI 自然动量时,从同套基础常量计算

若应用需要的正是电子质量乘光速,可以在应用层计算,不修改 SciPy 的全局常量字典:

from scipy import constants as c

mass, mass_unit, mass_uncertainty = c.physical_constants["electron mass"]
momentum_si = mass * c.c
momentum_uncertainty_si = mass_uncertainty * c.c

这里光速按定义为精确常量,因此这项乘法的不确定度来自电子质量;结果单位为 kg m s^-1。若实际要计算多个具有相关性的实验常量组合,不能把这段单一乘法的不确定度规则推广成任意公式。

需要 MeV/c 的调用方应按原有单位体系明确转换,并记录采用的数据版本。避免在业务代码中散落一个没有单位、没有数据年代的硬编码数字,也不要去修改私有 _aliases:进程内临时改字典会影响其他调用,却无法让锁文件记录这项改动。

重新计算受影响的派生量

先找出应用真正读取的是这两个字典项、缩写别名,还是 m_e 和 c。只有走到受影响条目的计算需要按任务复核,不能把所有使用 SciPy 常量的结果一概判坏。

验收保留原始三元组、替代计算的单位与绝对不确定度,再比较下游量的变化是否符合误差预算。正式 1.18.1 仍有上述别名逻辑;关闭问题或合并后续改动,不足以证明当前安装包已带修补。恢复直接读取前,核对目标发行版的条目与同版本基础常量一致,再移除应用层计算。