@Astorek: Das ist historisch bedingt, also in der Geschichte von Python. Ich würde aber nicht sagen dass das generell so ist, denn es gibt durchaus Programmiersprachen die an solchen Stellen nur Wahrheitswerte akzeptieren und der Benutzer explizit dafür sorgen muss. Python hatte Anfangs keinen dedizierten Datentyp für Wahrheitswerte und hat von der Programmiersprache in der es implementiert wurde die Werte 0 und 1 beziehungsweise 0 und alle anderen Zahlen übernommen.
Mittlerweile gibt es den Datentyp `bool`, der aber von `int` abgeleitet ist und die Werte `True` und `False` entsprechen auch immer noch den Zahlenwerten 1 und 0:
Code: Alles auswählen
In [1]: issubclass(bool, int)
Out[1]: True
In [2]: isinstance(True, int)
Out[2]: True
In [3]: True + 0
Out[3]: 1
In [4]: False + 0
Out[4]: 0
In [5]: int(True), int(False)
Out[5]: (1, 0)
Zeichenketten sind übrigens keine Ausnahme: Jeder Datentyp kann selber festlegen welche seiner Werte im boole'schen Kontext wahr oder unwahr sind. Bei Sequenzen und Containertypen in der Standardbibliothek ist die leere Sequenz/der leere Container unwahr und alle anderen wahr. Das heisst man hätte im Beispiel nicht einmal das `len()` gebraucht:
Code: Alles auswählen
In [6]: import sys
In [7]: sys.argv[1:]
Out[7]: []
In [8]: not sys.argv[1:]
Out[8]: True
In [9]: not [42]
Out[9]: False
In [10]: [bool(x) for x in [[], {}, set()]]
Out[10]: [False, False, False]
In [11]: [bool(x) for x in [[23], {'answer': 42}, {4711}]]
Out[11]: [True, True, True]
Edit: Bei Shell-Programmierung ist es übrigens anders herum: Ein Rückgabecode 0 ist wahr während alle anderen Werte unwahr sind.