None

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ordentlich wäre ohnehin die Prüfung mit is.

Code: Alles auswählen

if int_val is None:
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

/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
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?
Sirius3
User
Beiträge: 17752
Registriert: Sonntag 21. Oktober 2012, 17:20

Ausnahmen bestätigen die Regel:

Code: Alles auswählen

>>> type(type) is type
True
Antworten