Python 2.7 と Python 3.3 の辞書の順序: 変更の理由
Python 2.7 では、辞書キーの順序は任意でしたが一貫性がありました。ただし、この動作は Python 3.3 で変更され、vars() などのメソッドから取得されたキーの順序が非決定的であるように見えます。
この非決定性は、2012 年に実装されたセキュリティ修正に起因しており、デフォルトで有効になっていました。 Python 3.3では。この修正では、特定のセキュリティ脆弱性を防ぐためにハッシュのランダム化が導入されました。その結果、辞書とセットの反復順序は予測不可能になりました。
Python 3.6 では、挿入順序を保持する dict クラスの新しい実装が導入されました。その結果、Python 3.7 では、辞書の順序保持動作が保証されるようになりました。
特定の使用例における予期しない一貫性
順序付けが非決定的であるにもかかわらず、次のような問題があります。一貫した順序が保たれている場合。例:
list({str(i): i for i in range(10)}.keys())
Python 2.7 および Python 3.6 (およびそれ以降) では、この式は一貫して次の順序を生成します:
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
これは、反例では集合内包表記が使用されており、暗黙的な順序付き辞書が作成されるためです。ただし、Python 3.3 では、ハッシュ衝突の処理の制限により、順序が依然として異なる可能性があります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3