Beispiele
Schauen wir uns ein paar weitere Beispiele an, um die Konzepte, die wir gelernt haben, zu vertiefen:
Beispiel 1: Funktion mit veränderlichem Standardargument
Vermeiden Sie die Verwendung von veränderlichen Objekten als Standardargumente in Funktionen:
def bad_append(new_item, a_list=[]):
a_list.append(new_item)
return a_list
print(bad_append('one'))
Ausgabe:
['one']
Es sieht gut aus, aber wenn wir diese Funktion erneut aufrufen:
print(bad_append('two'))
Ausgabe:
['one', 'two']
Das Problem hier ist, dass der Standardwert von a_list
zur Funktiondefinitionszeit ausgewertet wird. Also wird jedes Mal, wenn Sie die Funktion aufrufen, derselbe Standardwert verwendet. Die richtige Methode ist es, ihn stattdessen zur Laufzeit innerhalb der Funktion zu erstellen.
def append_to_list(item: int, a_list: list = None) -> list:
"""Fügt ein Element einer Liste hinzu und gibt die aktualisierte Liste zurück."""
if a_list is None:
a_list = []
a_list.append(item)
return a_list
list_a = append_to_list(1, [1, 2, 3])
print(list_a)
Ausgabe:
[1, 2, 3, 1]
Beispiel 2: Kopieren von veränderlichen Objekten
Verwenden Sie das copy
-Modul, um ein neues Objekt zu erstellen, wenn Sie eine Kopie eines veränderlichen Objekts verwenden möchten:
import copy
## Demonstriert die Verwendung des copy-Moduls.
original_list = [1, 2, 3]
copied_list = copy.copy(original_list)
copied_list.append(4)
print("original_list:", original_list)
print("copied_list:", copied_list)
Ausgabe:
original_list: [1, 2, 3]
copied_list: [1, 2, 3, 4]
In diesem Beispiel ist copied_list
ein neues Objekt, das eine Kopie von original_list
ist. Wenn wir 4
an copied_list
anhängen, bleibt original_list
unverändert.
Beispiel 3: Tiefkopieren von veränderlichen Objekten
Für geschachtelte veränderliche Objekte funktioniert die Verwendung der copy
-Funktion nicht:
## Ihr Copy-Beispiel hier
original_nested_list = [[1, 2], [3, 4]]
copied_nested_list = copy.copy(original_nested_list)
copied_nested_list[0].append(5)
print("original_nested_list:", original_nested_list)
print("copied_nested_list:", copied_nested_list)
Ausgabe:
original_nested_list: [[1, 2, 5], [3, 4]]
copied_nested_list: [[1, 2, 5], [3, 4]]
Wir können sehen, dass wenn wir 5
an copied_nested_list
anhängen, auch original_nested_list
5
anhängt. Sie sollten daher stattdessen die deepcopy
-Funktion verwenden:
## Ihr Deepcopy-Beispiel hier
original_nested_list = [[1, 2], [3, 4]]
deep_copied_list = copy.deepcopy(original_nested_list)
deep_copied_list[0].append(5)
print("original_nested_list:", original_nested_list)
print("deep_copied_list:", deep_copied_list)
Ausgabe:
original_nested_list: [[1, 2], [3, 4]]
deep_copied_list: [[1, 2, 5], [3, 4]]
In diesem Beispiel kopiert die deepcopy
-Funktion das original_nested_list
rekursiv, während die copy
-Funktion ein Referenzobjekt auf die ersten Ebenen der Daten von original_nested_list
erstellt.