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.
[To pytanie] (http://stackoverflow.com/q/28963860/2003420) może dać ci dobre pojęcie o tym, co się dzieje – bvidal
Czy przeczytałeś dokumentację funkcji '' id() '(https://docs.python.org/2/library/functions.html#id)? Tęskniłeś za czymś kluczowym. –
@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