История изменений
Исправление LeninGad, (текущая версия) :
переменная типа dict имеет (тащит за собой) параллельное представление в виде списка
На человеческом языке процитированное правильно, но в контексте традиционной тиклерской терминологии может сбить с толку.
Hash entries для dict собираются в двусвязный список, но этот «список» ничего общего не имеет со встроенным типом «список» (tclListType). Последний неудобен для вставок и удалений, он сильно тормозил бы при таком использовании.
У Tcl_Obj может быть максимум два представления: строковое и некое «внутреннее». В каждый момент времени у объекта присутствует хотя бы одно, иногда оба. Значение не может одновременно иметь tclListType и tclDictType в качестве внутреннего представления. Тот двусвязный список, который используется для упорядочивания ключей — часть внутреннего представления tclDictType.
Кстати, это означает, что вот так делать не надо никогда:
foreach {key value} $mydict { ... }
По смыслу dict for {key value} $mydict {...}
не отличается ничем, но foreach преобразует значение dict'а в список (как минимум это лишнее копирование, но в неудачном случае можно потерять цепочку hash entries, и она будет заново создаваться при использовании $mydict как словаря.
Исходная версия LeninGad, :
переменная типа dict имеет (тащит за собой) параллельное представление в виде списка
На человеческом языке процитированное правильно, но в контексте традиционной тиклерской терминологии может сбить с толку.
Hash entries для dict собираются в двусвязный список, но этот «список» ничего общего не имеет со встроенным типом «список» (tclListType). Последний неудобен для вставок и удалений, он сильно тормозил бы при таком использовании.
У Tcl_Obj может быть максимум два представления: строковое и некое «внутреннее». В каждый момент времени у объекта присутствует хотя бы одно, иногда оба. Значение не может одновременно иметь tclListType и tclDictType в качестве внутреннего представления. Тот двусвязный список, который используется для упорядочивания ключей — часть внутреннеге представления tclDictType.
Кстати, это означает, что вот так делать не надо никогда:
foreach {key value} $mydict { ... }
По смыслу dict for {key value} $mydict {...}
не отличается ничем, но foreach преобразует значение dict'а в список (как минимум это лишнее копирование, но в неудачном случае можно потерять цепочку hash entries, и она будет заново создаваться при использовании $mydict как словаря.