Als beginnende ontwikkelaar kom je vaak deze code tegen in voorwaardelijke uitspraken:

if value:
    print("Er is een waarde!")

In het begin kan het verwarrend zijn om te begrijpen waarom de simpele if value: iets controleert.
Vooral tussen de volgende twee:

  • None
  • "" (lege string)

Aangezien beide worden geëvalueerd als False, lijkt het alsof ze hetzelfde zijn.

Maar is dat echt zo?


Falsy-waarden

In Python worden de volgende waarden geëvalueerd als False in voorwaardelijke uitspraken:

  • None
  • False
  • 0, 0.0
  • "" (lege string)
  • [] (lege lijst)
  • {} (lege dictionary)
  • set(), () en andere lege collecties

Dat betekent dat if not value: alle bovenstaande gevallen op een rijtjes verzamelt.


None en "" zijn verschillende

Ze zien er anders uit en functioneren anders.

value1 = None
value2 = ""

print(value1 == value2)  # False
print(value1 is value2)  # False

print(bool(value1))  # False
print(bool(value2))  # False
  • == is voor waardevergelijking, terwijl is identiteit vergelijkt.
  • None is een speciale object dat betekent “er is nog geen waarde”,
  • "" is een string die leeg is.

Vergelijking tussen lege en None spraakballon

In de bovenstaande afbeelding houdt de man links een spraakballon vast maar zegt niets — dit vertegenwoordigt de lege string "".
De vrouw rechts heeft zelfs geen spraakballon — dit is None.

Beide worden geëvalueerd als False onder de volgende voorwaarde:

male_voice = ""
female_voice = None

if not male_voice and not female_voice:
    print("Beiden zeggen niets!")  # Beide zijn False, dus dit wordt uitgevoerd

Hoe onderscheiden we ze in de praktijk?

Laten we een voorbeeld bekijken van het verwerken van gebruikersinvoer:

username = user_input.get("username", None)
  1. Als de gebruiker niets invoert → None
  2. Als de gebruiker een lege string invoert → ""

Als je deze anders wilt behandelen?

if username is None:
    print("Geen invoer gegeven!")
elif username == "":
    print("Je hebt een lege string ingevoerd.")
else:
    print("Ingevoerde waarde:", username)

Veel voorkomende fouten in de praktijk

De volgende code filtert soms onbedoeld alle Falsy-waarden uit:

if not username:
    print("Geen invoer")

Maar deze voorwaarde omvat niet alleen lege strings maar ook None, 0, lege lijsten, enzovoorts.
Daarom moet je je intenties duidelijk maken:

  • Als de waarde leeg is maar een string mag zijnif username is None:
  • Als de string leeg mag zijn maar moet bestaanif username != "":
  • Als er gewoon geen waarde mag zijnif not username:

Ter afsluiting

None en "" zijn niet hetzelfde. Maar ze gedragen zich allebei als False.
Als je dit verschil kent en gebruikt, kan de bedoeling van je code duidelijker en foutloos zijn.

In het volgende artikel gaan we dieper in op andere Falsy-waarden zoals 0, [], {} en het verschil tussen is en ==!