与 `None` 进行比较将导致逐元素对象。

31

显然(在“未来”中)将不再可能使用以下内容:

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>

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

1个回答

62
你正在寻找is
if a is None:
    a = something else
问题在于,如果输入元素a是一个numpy数组,并使用“==”运算符,则numpy将尝试执行逐元素比较并告诉您无法进行比较。
对于numpy数组a,“a == None”会出错,“np.all(a == None)”不会出错,但并不会产生预期的结果。而“a is None”则会搜寻到正确的结果,而且无论a的数据类型如何都可以这样做。

从Java的角度来看,is 被认为是一个引用检查,而 == 被认为是一个 equals() 检查(它可以被重写,如果没有被重写,它只是一个引用检查)。 - Matthias
1
@Matthias 没错。从 Java 的角度来看,Python 的 == 会触发 Java 的 .equals,而在 numpy 中被重写为执行逐元素检查。Python 的 is 相当于在 Java 中检查引用(类似于使用字符串的 ==)。然而,对于 Python 中的字符串(即 a ='hello'; b ='hello'),a is b 仍将返回 true,因为它们都是相同的常量('hello')。 - Imanol Luengo
1
@Matthias 看看这个优秀答案,了解 is 运算符的更多细节:https://dev59.com/8WYr5IYBdhLWcg3wdqCv。 - Imanol Luengo
1
在Java中,最后一个比较也将为真(或者是VM相关的吗?) - Matthias
@Matthias 老实说,已经很久没有用 Java 编程了,所以有点哈哈。只是想指出 Python 的行为 =P。 - Imanol Luengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接