Seite 1 von 1

None

Verfasst: Dienstag 9. Juli 2013, 16:06
von joh#
Hallo,

kann mir jemand sagen, wieso ich hier nicht zu a=1 komme
(obwohl intVal None zugewiesen wurde):

Code: Alles auswählen

intVal =  None
print type(intVal)
if (type(intVal) == None):
    a = 1
else:
    a = 2

gruß
joh

Re: None

Verfasst: Dienstag 9. Juli 2013, 16:15
von EyDu
Hallo,

dann schau dir doch mal an, was ``type(None)`` für ein Ergebnis liefert. Außerdem sollte man nicht gegen ``type(...)`` testen, sondern mittels ``isinstance(...)``. Oft ist aber bereits ein Test auf Typen ein Fehler. Python verwendet Duck-Typing, da muss ein Objekt nur ein bestimmtes Verhalten an den Tag legen und nicht von einem Typ abhängen. Auch solltest du keine Klammern bei den if-Statements verwenden, die gehören dort nicht hin.

Re: None

Verfasst: Dienstag 9. Juli 2013, 19:16
von /me
Ordentlich wäre ohnehin die Prüfung mit is.

Code: Alles auswählen

if int_val is None:

Re: None

Verfasst: Mittwoch 10. Juli 2013, 07:33
von joh#
/me hat geschrieben:Ordentlich wäre ohnehin die Prüfung mit is.

Code: Alles auswählen

if int_val is None:
ok, das führt (erwartungsgemäß) dann auch zum Ausführen des if-Zweiges.
Komisch (oder gewöhnungsbedürftig) ist nur, daß in

Code: Alles auswählen

intVal =  None
print type(intVal)
b = intVal == None
print b
if b:
    a = 1
else:
    a = 2
der if-Zweig ausgeführt wird obwohl das b sein True aus dem
im ersten Bsp. "nicht richtigem True liefernden" Vergleich bekommt.
Wird hier das True irgendwie veredelt :)
joh

Re: None

Verfasst: Mittwoch 10. Juli 2013, 07:53
von BlackJack
@joh#: Ich verstehe nicht so ganz was Du hier fragst. Natürlich kannst Du `None` auch mit ``==`` vergleichen und bekommst `True` wenn die Ausdrücke auf beiden Seiten `None` ergeben. In Deinem ersten Beispiel ergeben beide Seiten aber nicht `None` sondern eine ist `None` und die andere ist `NoneType`. Und *die* beiden Objekte sind weder gleich (``==``) und schon gar nicht identisch (``is``). Du vergleichst im ersten Beispiel den Typ eines Objekts mit einem Exemplar dieses Typs. Dass das `False` ist, sollte eigentlich nicht überraschen. Hättest Du denn erwartet das ``type(42) == 23`` wahr ist? Warum sollte dann ``type(None) == None`` wahr sein?

Re: None

Verfasst: Mittwoch 10. Juli 2013, 09:52
von Sirius3
Ausnahmen bestätigen die Regel:

Code: Alles auswählen

>>> type(type) is type
True