有人可以解释以下脚本输出背后的逻辑吗?
import numpy
if(numpy.dtype(numpy.float64) == None):
print "Surprise!!!!"
谢谢:)
最佳答案
看起来像一个不幸的事故:有人决定 dtype(None)
将“默认”为 float (尽管 dtype()
是一个错误)。然后其他人编写了 dtype.__eq__
以便在比较之前将其第二个参数转换为 dtype。所以 dtype(float) == None
是 dtype(float) == dtype(None)
这是真的。
您可以在此处查看源代码中的注释:descriptor.c#L1217
- Get typenum from an object -- None goes to NPY_DEFAULT_TYPE
当然 NPY_DEFAULT_TYPE 是 float 的(至少通常是这样)。
至于__eq__
操作符,在这里:descriptor.c#L3317 .它执行我概述的操作:
if (!PyArray_DescrCheck(other)) {
if (PyArray_DescrConverter(other, &new) == NPY_FAIL) {
return NULL;
}
}
所以这是从 ==
右侧的任何内容到 dtype 对象的转换,通过前面提到的转换器函数,将 None
转换为 dtype( float )
。
编辑:我发现这很有趣而且看起来像是个意外,所以我创建了一个补丁并提交给维护者:https://github.com/numpy/numpy/pull/4532 .
关于python - 为什么 numpy.dtype ('float64' ) 特别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22575050/