Adakah yang bisa menjelaskan perilaku dicts kosong dalam ekspresi generator python? [duplikat]

Beberapa teman dan saya sedang mendiskusikan hal-hal yang berkaitan dengan manajemen memori dengan Python ketika kami menemukan perilaku di bawah ini:

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]

Apa yang mengejutkan di sini adalah bahwa kita tampaknya tidak memiliki perilaku yang terdefinisi dengan baik: perintah tersebut bukanlah sesuatu yang baru atau referensi yang sama setiap saat.

Selain itu, kami mendapatkan perilaku aneh ini (tidak ada kode yang dijalankan di penerjemah antara dua cuplikan ini).

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]

Adakah yang bisa menjelaskan perilaku ini? Menggunakan pemahaman daftar (l = [{} for _ in range(6)]) menunjukkan alamat yang berbeda untuk setiap dict.


person sitaktif    schedule 10.03.2015    source sumber
comment
Pertanyaan ini mungkin memberi Anda gambaran bagus tentang apa yang terjadi   -  person bvidal    schedule 10.03.2015
comment
Apakah Anda membaca id() dokumentasi fungsi? Anda melewatkan sesuatu yang penting di sana.   -  person Martijn Pieters    schedule 10.03.2015
comment
@MartijnPieters Saya tidak terkejut id() menggunakan kembali nomor yang sama. Saya terkejut dengan wajah yang menggunakan kembali nomor yang sama sementara saya menyimpan referensi ke sana (yang merupakan kesalahan saya).   -  person sitaktif    schedule 10.03.2015
comment
@sitaktif: benar, Anda tidak menyimpan referensi apa pun ke {} objek yang Anda hasilkan; generator memproduksinya, tetapi tidak mereferensikannya setelahnya.   -  person Martijn Pieters    schedule 10.03.2015
comment
@sitaktif: Saya pikir Anda salah di sini: dikt tersebut tidak selalu baru atau referensi yang sama setiap saat. Ini adalah sebuah dict baru setiap saat; ekspresi sebelah kiri dalam ekspresi generator dievaluasi lagi setiap iterasi.   -  person Martijn Pieters    schedule 10.03.2015
comment
@MartijnPieters tentu saja   -  person sitaktif    schedule 11.03.2015


Jawaban (1)


Kamus-kamus tersebut dimusnahkan segera setelah tidak lagi direferensikan oleh generator. Anda membandingkan ID benda mati, dan ID dapat digunakan kembali.

person Kevin    schedule 10.03.2015
comment
Inilah yang saya lewatkan - fakta bahwa dengan generator, saya kehilangan referensi ke item tersebut. Terima kasih! - person sitaktif; 10.03.2015