Czy w Pythonie istnieje różnica między wywołaniem clear()
a przypisaniem {}
do słownika? Jeśli tak, co to jest? Przykład:
d = {"stuff":"things"}
d.clear() #this way
d = {} #vs this way
python
dictionary
Marcin
źródło
źródło
Odpowiedzi:
Jeśli masz inną zmienną również odnoszącą się do tego samego słownika, jest duża różnica:
Dzieje się tak, ponieważ przypisywanie
d = {}
tworzy nowy, pusty słownik i przypisuje go dod
zmiennej. To pozostawiad2
wskazanie na stary słownik, w którym wciąż znajdują się pozycje. Jednakd.clear()
czyści ten sam słownik, któryd
id2
oba wskazują.źródło
d = {}
utworzy nową instancję dla,d
ale wszystkie inne odniesienia będą nadal wskazywały na starą zawartość.d.clear()
zresetuje zawartość, ale wszystkie odwołania do tej samej instancji będą nadal poprawne.źródło
Oprócz różnic wymienionych w innych odpowiedziach istnieje również różnica prędkości. d = {} jest ponad dwukrotnie szybsze:
źródło
d = {}
powinno być szybsze, ponieważ czyszczenie całości można pozostawić w Garbage Collector na później.Jako ilustracja rzeczy już wspomnianych:
źródło
.clear
modyfikuje obiekt, ale `= {}` tworzy nowy obiekt.Oprócz odpowiedzi @odano wydaje się, że użycie
d.clear()
jest szybsze, jeśli chcesz wielokrotnie wyczyścić dyktando.Wynik to:
źródło
Metody mutujące są zawsze przydatne, jeśli oryginalny obiekt nie znajduje się w zakresie:
Ponowne przypisanie słownika spowodowałoby utworzenie nowego obiektu i nie zmodyfikowałoby oryginalnego.
źródło
Jedna rzecz, o której nie wspomniano, to kwestie dotyczące zakresu. Niezbyt dobry przykład, ale oto przypadek, w którym napotkałem problem:
Rozwiązanie to zastępuje
c_kwargs = {}
sięc_kwargs.clear()
Jeśli ktoś wymyśli bardziej praktyczny przykład, nie krępuj się edytować tego posta.
źródło
global c_kwargs
prawdopodobnie też by działało, nie? Chociaż prawdopodobnieglobal
nie jest najlepszą rzeczą, gdy używa się ich dużo.global
spowodowałoby, że funkcja zachowywałaby się inaczej - wszystkie wywołania conf_decorator współdzieliłyby wówczas tę samą zmienną c_kwargs. Uważam, że Python 3 dodałnonlocal
słowo kluczowe, aby rozwiązać ten problem, i to zadziała.Ponadto czasami instancja dict może być podklasą dict (
defaultdict
na przykład). W takim przypadkuclear
preferowane jest użycie , ponieważ nie musimy pamiętać dokładnego typu dyktu, a także unikać duplikowania kodu (łączenia linii rozliczeniowej z linią inicjalizacyjną).źródło