You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何将pandas生成字典的numpy.int64类型键转为原生int后,键类型仍未改变?

为什么字典键的类型没被替换?

这其实是Python字典键的相等性与哈希机制在起作用,咱们一步步拆解你的代码逻辑:

核心原因:numpy.int64和原生int的"等价性"

在Python里,字典判断两个键是否是同一个,看的是两个关键条件:

  1. 两者的哈希值相等(hash(np.int64(0)) == hash(0) 结果为True)
  2. 两者比较相等(np.int64(0) == 0 结果也为True)

所以当你执行d.update({k_nat:1})时,Python会认为k_nat(原生int 0)和原字典里的np.int64(0)是同一个键——它只会把这个键对应的值从None更新为1,而不会替换键本身的类型,原字典里的键还是最初的numpy.int64对象。

关于你看到的"矛盾"输出

你打印字典时看到的{0: None}和{0: 1},其实是Python的"友好显示"——它会把np.int64(0)简化显示成0,但底层存储的键类型并没有改变,这也是为什么最后循环打印键类型时,结果还是<class 'numpy.int64'>。

如何真正把键转换成原生int?

如果你想把所有numpy.int64类型的键替换成原生int,有两种可靠的方式:

方法1:字典推导式创建新字典(推荐)

import numpy as np
d = {np.int64(0): None, np.int64(1): "hello"}
# 遍历原字典,将每个键转为原生int
new_d = {int(k): v for k, v in d.items()}

# 验证类型
for k in new_d.keys():
    print(type(k))  # <class 'int'>

方法2:原地修改字典

import numpy as np
d = {np.int64(0): None, np.int64(1): "hello"}
# 先把所有键存入列表,避免遍历过程中字典结构变化引发错误
keys = list(d.keys())
for k in keys:
    if isinstance(k, np.int64):
        # 取出旧键对应的值并删除旧键
        value = d.pop(k)
        # 添加新的原生int键和对应值
        d[int(k)] = value

# 验证类型
for k in d.keys():
    print(type(k))  # <class 'int'>

内容的提问来源于stack exchange,提问作者darbocks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:17:46