Ordenação do dicionário em Python 2.7 vs Python 3.3: Por que a mudança?
No Python 2.7, a ordem das chaves do dicionário era arbitrária, mas consistente . No entanto, esse comportamento mudou no Python 3.3, onde a ordem das chaves obtidas de métodos como vars() parece não determinística.
Esse não determinismo resultou de uma correção de segurança implementada em 2012, que foi habilitada por padrão em Python 3.3. A correção introduziu a randomização de hash para evitar certas vulnerabilidades de segurança. Como resultado, a ordem de iteração de dicionários e conjuntos tornou-se imprevisível.
No Python 3.6, foi introduzida uma nova implementação para a classe dict que preserva a ordem de inserção. Consequentemente, a partir do Python 3.7, o comportamento de preservação de ordem para dicionários agora é garantido.
Consistência inesperada em certos casos de uso
Apesar da ordem não determinística, existem casos em que uma ordem consistente é mantida. Por exemplo:
list({str(i): i for i in range(10)}.keys())
No Python 2.7 e Python 3.6 (e posterior), esta expressão produz consistentemente a ordem:
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
Isso ocorre porque o contra-exemplo usa uma compreensão de conjunto, que cria um dicionário ordenado implícito. No Python 3.3, entretanto, a ordem ainda pode variar devido às limitações no tratamento de colisões de hash.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3