2015-11-27 4 views
22

Apparantly wird es (in der‚Zukunft‘) nicht mehr möglich sein, die folgenden zu verwenden:Vergleich zu `None` wird in einem Objekt führt element

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. 

Dies bricht auch die verzögertes Laden Muster für numpy Arrays :

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

Mit welchen anderen Möglichkeiten können Sie weiterhin faule Initialisierung verwenden?

+2

Welche Version von Numpy ('np.version.version') erhalten Sie diesen Fehler mit? Hast du auch 'is None' probiert anstatt' == None'? AFAIK, 'is' kann nicht überschrieben werden, daher kann' numpy.array' keine elementweise "is" -Operation definieren. –

+1

@tobias a) Version '1.9.2' b) ist None funktioniert ohne eine Warnung Dank – Matthias

Antwort

47

Sie suchen is:

if a is None: 
    a = something else 

Das Problem ist, dass durch Verwendung des == Operator, wenn das Eingangselement a ein numpy Array ist, numpy versuchen wird, ein Element weiser Vergleich durchführen und Ihnen sagen, dass du es nicht vergleichen kannst.

Für a ein numpy Array, a == None gibt Fehler, np.all(a == None) nicht (aber nicht das, was Sie erwarten). Stattdessen funktioniert a is None unabhängig vom Datentyp a.

+0

so wird aus einer Java-Sicht das 'ist' als eine Referenzprüfung betrachtet, während die '==' als ein 'betrachtet wird equals() 'check (das könnte überschrieben werden und wenn nicht überschrieben, ist es nur eine Referenzprüfung) – Matthias

+1

@Matthias Genau. Aus Java-Sicht würde das '==' des Pythons javas '.equals' auslösen, was in 'numpy' überschrieben ist, um eine * elementweise Überprüfung * durchzuführen. Pythons 'is' wäre gleichbedeutend mit der Suche nach Referenzen in Java (ähnlich der Verwendung von' == 'mit Strings). Für Strings in Python (d. H. "A =" Hallo "; b =" Hallo ") würde das" a ist b "jedoch immer wahr zurückgeben, da beide die gleiche Konstante (" Hallo ") sind. –

+1

@Matthias schauen [diese ausgezeichnete Antwort] (http://stackoverflow.com/questions/13650293/understanding-pythons-is-operator), für weitere Details des 'ist' Betreibers. –

Verwandte Themen