【问题标题】:Comparison to `None` will result in an elementwise object与“无”的比较将产生一个元素对象
【发布时间】:2015-11-27 17:34:17
【问题描述】:

显然(在“未来”)将无法再使用以下内容:

import numpy as np
np.array([0,1,2]) == None
> False
> FutureWarning: comparison to `None` will result in an elementwise object comparison in the future.

这也打破了 numpy 数组的延迟加载模式:

import numpy as np
def f(a=None):
    if a == None: 
        a = <some default value>
    <function body>

还有哪些可能让您仍然使用延迟初始化?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    你在找is:

    if a is None:
        a = something else
    

    问题在于,通过使用 == 运算符,如果输入元素 a 是一个 numpy 数组,numpy 将尝试执行元素比较并告诉您无法比较它。

    对于 a 一个 numpy 数组,a == None 会给出错误,np.all(a == None) 不会(但不会像您期望的那样)。不管a 的数据类型如何,a is None 都将起作用。

    【讨论】:

    • 所以从 Java 的角度来看,is 被认为是参考检查,而 == 被认为是 equals() 检查(可以被覆盖,如果不被覆盖,它只是参考检查)
    • @Matthias 没错。从 java 的角度来看,python 的 == 将触发 java 的 .equals,在 numpy 中被覆盖以执行 逐元素检查。 Python 的is 等同于检查java 中的引用(类似于将== 与字符串一起使用)。但是,对于 python 中的字符串(即a = 'hello'; b = 'hello'),a is b 仍然会返回 true,因为它们都是相同的常量('hello')。
    • @Matthias 查看this excellent answer,了解is 运算符的更多详细信息。
    • 最后一个比较在 Java 中也是正确的(或者是否依赖于 VM?)
    • @Matthias 老实说,已经很久没有用 Java 编程了,所以可能是哈哈。只是想指出 python =P 中的行为
    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2014-11-02
    相关资源
    最近更新 更多