Gruß, Chabrowiten! Im Vorgriff auf den Start eines neuen Threads zum Kurs
"Webentwickler in Python" möchten wir eine neue nützliche Übersetzung veröffentlichen. Lass uns gehen!
Nachdem ich
wieder mehrere Interviews besucht und die Testaufgaben bestanden hatte, bemerkte ich, dass die Interviewer Aufgaben wie die folgenden mögen.
def f(x, l=[]): for i in range(x): l.append(i * i) return l >>> f(2) >>> f(3, [0, 1, 2]) >>> f(3)
Frage: Was wird dieser Code ausgeben?
Die Ausgabe der ersten beiden Zeilen ist ziemlich offensichtlich, aber das Ergebnis der dritten Zeile
f(3)
schien mir nicht so einfach zu sein. Mal sehen, was passiert, nachdem die Funktion
f
initialisiert wurde. Um diesen Code auszuführen, verwende ich
IPython .
>>> f <function __main__.f(x, l=[])> >>> f.__defaults__ ([],)
Die leere Liste, die wir aus dem Ergebnis der Ausführung von
f.__defaults__
ist die Variable
l
im Funktionscode.
>>> f(2) [0, 1]
Nichts Besonderes.
>>> f <function __main__.f(x, l=[0, 1])> >>> f.__defaults__ ([0, 1],)
Jedoch! Nun sehen wir, dass die Variable
l
aufgrund der Variabilität des Listenobjekts in Python und der Übergabe der Argumente der Funktion als Referenz den Wert
[0, 1]
.
>>> f(3, [0, 1, 2]) [0, 1, 2, 0, 1, 4] >>> f <function __main__.f(x, l=[0, 1])>
Auch nichts Besonderes. Übergeben Sie einfach das Listenobjekt als Variable
l
.
>>> f(3) [0, 1, 0, 1, 4] >>> f <function __main__.f(x, l=[0, 1, 0, 1, 4])>
Und jetzt das interessanteste. Wenn Sie
f(3)
ausführen, verwendet Python nicht die leere Liste, die im Funktionscode definiert ist, sondern die Variable
l
mit den Werten aus
f.__defaults__ ([0, 1])
.
PSWenn Sie eine Funktion benötigen, die nach jedem Aufruf eine leere Liste verwendet, sollten Sie Folgendes verwenden (setzen Sie den Wert von
'l'
auf
'None'
).
def f(x, l=None): if l is None: l = [] for i in range(x): l.append(i * i) return l >>> f(2) [0, 1] >>> f(3, [0, 1, 2]) [0, 1, 2, 0, 1, 4] >>> f(3) [0, 1, 4]
Fazit
Also habe ich eine der beliebtesten Testaufgaben für ein Interview gemacht. Dieser Beitrag soll zeigen, dass Sie sich jedoch nicht immer auf Ihre Intuition verlassen können, wie ich es alleine tue :-).
Wir hoffen, dass diese Übersetzung für Sie hilfreich ist. Traditionell warten wir auf Kommentare und sehen uns auf dem
Kurs .