Доступ к списку во время сортировки
Могу ли я получить доступ к списку, пока он сортируется в list.sort()
b = ['b', 'e', 'f', 'd', 'c', 'g', 'a']
f = 'check this'
def m(i):
print i, b, f
return None
b.sort(key=m)
print b
это возвращается
b [] check this
e [] check this
f [] check this
d [] check this
c [] check this
g [] check this
a [] check this
Обратите внимание, что отдельные элементы списка b
отправляются в функцию m
. Но в точке m
список b
пуст, однако он может видеть переменную f
, которая имеет ту же область видимости, что и список b
. Почему функция m
печатает b
как []
?
Ответы
Ответ 1
Глядя на исходный код (CPython, возможно, другое поведение для других реализаций), становится очевидным странный вывод вашего скрипта:
/* The list is temporarily made empty, so that mutations performed
* by comparison functions can't affect the slice of memory we're
* sorting (allowing mutations during sorting is a core-dump
* factory, since ob_item may change).
*/
saved_ob_size = Py_SIZE(self);
saved_ob_item = self->ob_item;
saved_allocated = self->allocated;
Py_SIZE(self) = 0;
Комментарий говорит сам за себя: когда вы начинаете сортировку, список очищается. Ну, это "пусто" в глазах внешнего наблюдателя.
Мне очень нравится термин "завод по производству свалок".
Сравните также:
b = ['b','e','f','d','c','g','a']
f = 'check this'
def m(i):
print i, b, f
return None
b = sorted(b, key= m)
print b
Ответ 2
Это то, на что вы не можете положиться вообще - не только для списков - если только документация для используемого вами метода явно не указана иначе. Доступ к объекту в промежуточном состоянии - то есть после того, как была запущена некоторая итерация, но до того, как она была завершена, проблема связана с тем, что параллельный код работает много. Вы нашли редкий несовпадающий случай, но совет такой же: избегайте этой ситуации. Промежуточное состояние не гарантируется для вас значимым и не гарантируется, что оно будет "истинным" состоянием в соответствии с правилами этого объекта (когда оно, как правило, называется "несогласованным" состоянием).