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 仍有上述别名逻辑;关闭问题或合并后续改动,不足以证明当前安装包已带修补。恢复直接读取前,核对目标发行版的条目与同版本基础常量一致,再移除应用层计算。


