为何int在List[List[int]]中in判断返回False,np.int64却返回True?
现象底层成因
首先明确核心前提:你代码中通过df.values.tolist()生成的lst是嵌套列表,结构为[[31], [32], [33], [34], [35]],每个元素都是长度为1的单元素列表,而非整数本身。Python的in运算符本质是遍历列表中每个元素,依次执行元素 == 待判断值的比较,只要有一次比较结果为真就返回True,全部为假才返回False,两种类型返回结果不同的核心原因是==比较的实现逻辑完全不同:
- 对于Python原生
int类型:原生类型的相等判断严格遵循类型匹配规则,当int值和list类型值做比较时,因为二者类型完全不兼容,不会递归检查列表内部元素,直接返回False。因此31 == [31]结果为False,遍历完整个嵌套列表都找不到匹配项,最终返回No。 - 对于
numpy.int64类型:numpy数值类型重写了相等判断的__eq__方法,当numpy标量和序列类型(list、tuple等)做比较时,不会直接因类型差异返回False,而是会触发广播机制,将右侧序列转为numpy数组后逐元素比对,返回一个布尔数组。比如np.int64(31) == [31]不会返回单一布尔值,而是返回array([True])。而Python在判断in的匹配条件时,只要相等比较的返回值不是明确的False,就会对返回值做真值判定——非空的布尔数组会被判定为真,因此系统会认为二者相等,最终in判断返回Yes。
你可以通过几行简单代码验证这个逻辑:
import numpy as np # 原生int与单元素列表比较 print(31 == [31]) # 输出 False # numpy.int64与单元素列表比较 print(np.int64(31) == [31])# 输出 [ True ] # 对numpy的比较结果做真值判定 print(bool(np.int64(31) == [31])) # 输出 True
补充说明:numpy这种相等判断返回数组而非单一布尔值的设计,是为了适配向量化运算的需求,但在Python原生语法场景下很容易出现这类反直觉行为。你提到的用
lst=df['A'].values.tolist()生成一维整数列表的方案,本质是让列表元素直接变成整数,避免了拿数值和列表做跨类型比较的场景,自然不会出现行为差异。
内容的提问来源于stack exchange,提问作者sguo
相关产品推荐
相关产品推荐

