Примечание: Python 3.6 вводит новый, order-preserving implementation из dict
, что делает следующее устаревают из 3.6.
Вот три итерации вашего примера в трех различных сессий Python 3.4 переводчика:
Python 3.4.1 (default, Aug 8 2014, 15:05:42)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> d={}
>>> d[5]=5
>>> d[1]=1
>>> d["z"]="z"
>>> d["a"]="a"
>>> s=str(d)
>>> print(s)
{1: 1, 'z': 'z', 'a': 'a', 5: 5}
Python 3.4.1 (default, Aug 8 2014, 15:05:42)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> d={}
>>> d[5]=5
>>> d[1]=1
>>> d["z"]="z"
>>> d["a"]="a"
>>> s=str(d)
>>> print(s)
{1: 1, 'a': 'a', 5: 5, 'z': 'z'}
Python 3.4.1 (default, Aug 8 2014, 15:05:42)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> d={}
>>> d[5]=5
>>> d[1]=1
>>> d["z"]="z"
>>> d["a"]="a"
>>> s=str(d)
>>> print(s)
{1: 1, 5: 5, 'z': 'z', 'a': 'a'}
Таким образом, нет, строковое представление не является сортироваться или даже в том же порядке через вызовы интерпретации Reter. В версиях Python, вплоть до 3.2, порядок словарей (и их строковые представления) был произвольным, но последовательным - однако, это изменилось в Python 3.3 в результате security fix:
По умолчанию, __hash__()
значения объектов str, bytes и datetime «соленые» с непредсказуемым случайным значением. Хотя они остаются постоянными в рамках отдельного процесса Python, они не предсказуемы между повторными вызовами Python.
Это предназначено для обеспечения защиты от отказа в обслуживании, вызванного тщательно подобранными входами, которые используют наихудшую производительность вложения вложения, сложность O (n^2). См. http://www.ocert.org/advisories/ocert-2011-003.html.
Изменение значений хэша влияет на порядок итераций диктов, множеств и других отображений. Python никогда не предоставлял гарантии об этом заказе (и обычно он варьируется между 32-битными и 64-битными сборками).
Интересно. Однако, когда я делаю код, указанный здесь, http://pastebin.com/Rijtr3Mx, я получаю тот же результат каждый раз, хотя он не отсортирован. Получаете ли вы тот же результат, который я делаю там с тем же кодом? – Shule
Не обращайте внимания на вопрос, остается ли это до тех пор, пока я не закрою переводчика и не открою его снова. – Shule