Представьте, что у вас целая куча ведер. Красный - самый маленький, оранжевый - побольше, желтый - побольше, все цвета радуги.
Вы кладете красный внутрь апельсина, затем кладете оранжевый внутри желтого и так далее. Все ваши ведра теперь находятся внутри других ведер. Кроме фиолетового. Это самое большое ведро.
Теперь вы начинаете с красного ведра. Мы назовем это self
. Нам нужен алгоритм, подсчитывающий, сколько существует корзин. Давайте создадим переменную счетчика с именем level
.
Родителем красного ведра является оранжевое ведро, которое мы можем получить, используя p = self.parent
. Теперь p
относится к оранжевому ведру. Мы также хотим добавить 1 к нашему счетчику. Итак, мы делаем level += 1
.
Прямо сейчас p
- это оранжевое ведро. Но мы еще не закончили. Нам нужно выяснить, есть ли у оранжевого ведра родительский элемент. Мы запросим его родительский элемент и повторно используем ту же переменную p
, сказав p = p.parent
. После этого p
становится желтым ведром. И снова добавляем единицу к уровню.
Продолжаем так, пока не дойдем до фиолетового ведра. Фиолетовое ведро - это самое дальнее ведро. Поэтому, когда мы спрашиваем у фиолетового ведра его родителя, мы не получаем ответа. Другими словами, когда p
- фиолетовое ведро, а мы делаем p = p.parent
, p
больше не ведро!
Ну, мы выполняли цикл только до тех пор, пока p
все еще ведро. В коде это бит, который говорит while p:
. Итак, теперь мы прекращаем цикл, и наша переменная level
сообщает нам, сколько контейнеров было.
child.parent = self
сообщает ведру, куда следует go. Возьмем ведро еще больше. Черное ведро. Мы назовем это self
. А еще мы получим фиолетовое ведро. Мы назовем это child
. Теперь я хочу сказать фиолетовому ведру go черному ведру. child.parent = self
.