bw
Ну как я понимаю циклические ссылки всё же успешно разрешаются (удаляются объекты) в автоматическом режиме, просто такое разрешение может затянуться, если его не форсировать gc.collect()'ом?
Да, все верно
bw
> garbage collector __del__ не вызывает потому что не знает правильный порядок вызова деструкторов - и не удаляет объекты с __del__
Считаю это не нормальным поведением.
Но ведь все таки gc не может определить правильный порядок вызова __del__. Поэтому эти объекты не удаляются, а перемещаются в gc.garbage.
Откуда их можно удалить вручную. Автоматическое поведение было бы не всегда безопасным - и поэтому неправильным. Пока что питон не имеет решения данной проблемы.
garbage
A list of objects which the collector found to be unreachable but could not be freed (uncollectable objects). By default, this list contains only objects with __del__() methods.26.1Objects that have __del__() methods and are part of a reference cycle cause the entire reference cycle to be uncollectable, including objects not necessarily in the cycle but reachable only from it. Python doesn't collect such cycles automatically because, in general, it isn't possible for Python to guess a safe order in which to run the __del__() methods. If you know a safe order, you can force the issue by examining the garbage list, and explicitly breaking cycles due to your objects within the list. Note that these objects are kept alive even so by virtue of being in the garbage list, so they should be removed from garbage too. For example, after breaking cycles, do del gc.garbage to empty the list. It's generally better to avoid the issue by not creating cycles containing objects with __del__() methods, and garbage can be examined in that case to verify that no such cycles are being created.
bw
Андрей Светлов, спасибо, за разъяснения.
Вывод такой - надо больше думать, что ты делаешь :-).
Пожалуйста. Это действительно несколько неочевидная часть питона (хоть и понятно-логичная, но все же неочевидная).
Когда сам впервые столкнулся - был несколько озадачен. Потом вник и разобрался - вопросы отпали. Есть еще интересные примеры в работе с python memory management, иногда ведущие к memory leaks - и даже gc.collect не спасает. Но до сих пор все можно было решить через weakref
Отредактировано (Ноя. 18, 2008 22:53:21)