2015-03-10 5 views
5

Einige Freunde und ich waren Dinge im Zusammenhang mit der Speicherverwaltung in Python zu diskutieren, wenn wir auf das Verhalten unter gestolpert:Kann jemand das Verhalten leerer dicts in Python-Generator-Ausdrücken erklären?

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] 

Was überraschend ist dabei, dass wir gut definierten Verhaltensweisen nicht zu haben scheinen: die dict ist weder eine neue noch jedes Mal die gleiche Referenz.

Darüber hinaus haben wir dieses seltsame Verhalten (nicht Code wurde im Interpreter zwischen diesen beiden Schnipsel ausgeführt).

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] 

Kann jemand dieses Verhalten erklären? Bei Verwendung von Listen-Comprehensions (l = [{} for _ in range(6)]) werden für jedes Diktat unterschiedliche Adressen angezeigt.

+0

[Diese Frage] (http://stackoverflow.com/q/28963860/2003420) könnte Ihnen eine gute Vorstellung davon geben, was gerade passiert – bvidal

+0

Haben Sie die ['id()' Funktionsdokumentation gelesen] (https://docs.python.org/2/library/functions.html#id)? Du hast etwas Entscheidendes verpasst. –

+0

@MartijnPieters Ich bin nicht überrascht, dass 'id() 'die gleiche Nummer wieder verwendet. Ich war über das Gesicht überrascht, dass es die gleiche Nummer wieder verwendete *, während ich einen Hinweis darauf behielt * (was mein Irrtum war). – sitaktif

Antwort

4

Die Wörterbücher werden gelöscht, sobald sie vom Generator nicht mehr referenziert werden. Sie vergleichen die IDs von toten Objekten, und IDs können wiederverwendet werden.

+0

Genau das habe ich verpasst - die Tatsache, dass ich mit einem Generator den Bezug zum Gegenstand verliere. Vielen Dank! – sitaktif