2015-03-10 14 views
5

Niektórzy znajomi i ja omawialiśmy sprawy związane z zarządzaniem pamięcią w Pythonie, kiedy natknęliśmy się na poniższej zachowań:Czy ktoś może wyjaśnić zachowanie pustych dyktorów w wyrażeniach generatora Pythona?

In [46]: l = ({} for _ in range(6)) 

In [47]: [ id(i) for i in l] 
Out[47]: 
[4371243648, # A 
4371245048, # B 
4371243648, # A 
4371245048, # B 
4371243648, # etc. 
4371245048] 

Co jest zaskakujące jest to, że nie wydają się mieć dobrze zdefiniowane problemy: dict jest za każdym razem ani za każdym razem nowy, ani za każdym razem.

Do tego dochodzi dziwne zachowanie (kod nie był uruchamiany w interpretorze między tymi dwoma fragmentami).

In [48]: m = ({} for _ in range(6)) 

In [49]: [ id(i) for i in m] 
Out[49]: 
[4371154376, # C 
4371245048, # B (same B as above!) 
4371154376, # C 
4371245048, # B 
4371154376, 
4371245048] 

Czy ktoś może wyjaśnić to zachowanie? Używanie wyrażeń listowych (l = [{} for _ in range(6)]) pokazuje różne adresy dla każdego dict.

+0

[To pytanie] (http://stackoverflow.com/q/28963860/2003420) może dać ci dobre pojęcie o tym, co się dzieje – bvidal

+0

Czy przeczytałeś dokumentację funkcji '' id() '(https://docs.python.org/2/library/functions.html#id)? Tęskniłeś za czymś kluczowym. –

+0

@MartijnPieters Nie jestem zaskoczony, że 'id()' użyje tego samego numeru. Zaskoczyła mnie twarz, że ponownie użyła tej samej liczby *, podczas gdy ja zachowałem odniesienie do tego * (co było moim błędem). – sitaktif

Odpowiedz

4

Słowniki są niszczone, gdy nie są już przywoływane przez generator. Porównujesz identyfikatory martwych obiektów, a identyfikatory można wykorzystać ponownie.

+0

Dokładnie to przegapiłem - fakt, że z generatorem tracę odniesienie do przedmiotu. Dzięki! – sitaktif