Python における非決定的な辞書の順序付け: 説明
Python の辞書の順序付けは、バージョン 2.7 と 3.3 の間で大幅に変更されました。 Python 2.7 では、辞書キーの順序は一貫していて任意でしたが、Python 3.3 では順序が予測不能になりました。この非決定性は、根本的な理由と、それが Python 辞書の動作にどのような影響を与えるかについて疑問を引き起こしています。
非決定性の根源
非決定性の性質Python 3.3 での辞書の順序付けは、2012 年に実装されたセキュリティ修正に由来しており、Python 3.3 ではデフォルトで有効になっています。このセキュリティ対策では、セキュリティの脆弱性を防ぐために辞書の反復順序を予測不可能にするプロセスである「ハッシュ ランダム化」が導入されました。
ハッシュ ランダム化の説明
ハッシュ ランダム化には、次の変更が含まれます。辞書内の要素の位置を決定するために使用されるハッシュ関数。ハッシュ関数を変更すると、キーの保存と取得の順序が予測不能になり、Python の実行ごとに異なります。この追加された予測不可能なレイヤーにより、悪意のある攻撃者による予測可能なハッシュ関数の悪用がより困難になり、Python アプリケーションのセキュリティが強化されます。
辞書の順序付けへの影響
の導入ハッシュのランダム化は、辞書キーの順序に大きな影響を与えます。辞書キーの順序に依存するアプリケーションは、Python 3.3 以降のバージョンで予期しない動作が発生する可能性があります。たとえば、vars() を使用して変数が表示される順序は、実行ごとに異なる場合があります。
選択したケースでの一貫した順序付け
Python の非決定的な順序付けにもかかわらず3.3 では、特定のケースでは依然として一貫した順序が示されています。たとえば、元のリスト内のキーの順序が保持されるため、リスト内包表記を使用して構築された辞書内のキーの順序は予測可能なままです。
ハッシュのランダム化を無効にする (オプション)
ハッシュのランダム化の影響を受ける古いバージョンの Python では、PYTHONHASHSEED 環境変数を 0 に設定することでハッシュのランダム化を無効にすることができます。ただし、これはお勧めできません。ハッシュのランダム化によるセキュリティ上の利点が減少するためです。
今後の更新
Python 3.6 では、挿入順序を保持する dict の新しい実装が導入されました。さらに、Python 3.7 では、この順序保持動作が保証されており、これらのバージョン以降でも辞書の順序付けが一貫していることが保証されます。
以上がPython の辞書の順序付けが非決定的になったのはいつですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。