Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Susunan Utama Kamus Python 3 Bukan Deterministik?

Mengapa Susunan Utama Kamus Python 3 Bukan Deterministik?

Barbara Streisand
Barbara Streisandasal
2024-10-21 15:07:301000semak imbas

Why Is Python 3 Dictionary Key Ordering Non-Deterministic?

Penyusunan Bukan Penentuan Kunci Kamus dalam Python 3

Dalam Python 2, susunan kunci kamus adalah konsisten tetapi tidak dijamin. Walau bagaimanapun, dalam Python 3, susunan kekunci kamus yang diperoleh daripada fungsi seperti vars() kelihatan tidak menentukan.

Punca Bukan Penentuan

Perubahan ini ialah dikaitkan dengan pembetulan keselamatan yang dilaksanakan dalam Python 3.3. Untuk mengelakkan nilai cincang yang boleh diramal, benih rawak digunakan dalam pengiraan cincang. Rawak ini menghasilkan susunan kunci kamus yang tidak dapat diramalkan.

Memelihara Susunan dalam Python 3.6 dan Kemudian

Dalam Python 3.6, pelaksanaan baharu kamus telah diperkenalkan yang mengekalkan susunan sisipan secara lalai. Daripada Python 3.7 dan seterusnya, tingkah laku ini dijamin oleh spesifikasi bahasa Python.

Menterbalikkan Bukan Penentuan

Untuk melumpuhkan rawak cincang dan kembali kepada tingkah laku sebelumnya, tetapkan pembolehubah persekitaran PYTHONHASHSEED kepada 0. Walau bagaimanapun, ambil perhatian bahawa ini tidak digalakkan atas sebab keselamatan.

Pengecualian: Tetapkan Kekunci

Tidak seperti kamus, set dalam Python sentiasa dikekalkan tertib sisipan, tanpa mengira versi Python.

Contoh: Susunan Kunci Kamus Konsisten

Walaupun kunci kamus bukan deterministik dalam Python 3.3, menggunakan set untuk menukar kunci kamus kepada rentetan mengekalkan susunan. Contohnya:

<code class="python">set([str(i): i for i in range(10)].keys())</code>

Ini akan secara konsisten mengembalikan senarai ['0', '1', '2', '3', '4', '5', '6', '7' , '8', '9'].

Maklumat Tambahan

Rujuk dokumentasi objek.__hash__() untuk butiran lanjut tentang rawak cincang.

Atas ialah kandungan terperinci Mengapa Susunan Utama Kamus Python 3 Bukan Deterministik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn