На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD
  
    > [Python] бесконечная рекурсия
      Всем доброго времени суток
      Начал изучать этот замечательный язык, но в первом hello world'e уткнулся в бесконечную рекурсию
      ExpandedWrap disabled
        #!/usr/bin/env python
        class Node:
            Child=[]
            Parent=0
            Value=0
            def __init__(self,Value,Parent=0):
                self.Value=Value
                self.Parent=Parent
            def _getstr(self,tstr):
                s=""
                s+=tstr+"O: "+str(self.Value)
                tstr+="\t"
                if len(self.Child)==0:
                    return s
                for c in self.Child:
                    s+="\n"+tstr+c._getstr(tstr)
                return s
            def __str__(self):
                return self._getstr("")
         
         
            def Add(self,node):
                node.Parent=self
                self.Child.append(node)
                
        c=Node('Parent',0)
        print(c)
        c2=Node("child",c)
        print(c2)
        c.Add(c2)
        print(c)

      Цитата

      File "repositorii.py", line 11, in _getstr
      s+=tstr+"O: "+str(self.Value)//эта строчка повторяется много раз
      RuntimeError: maximum recursion depth exceeded while calling a Python object


      хотя у с2 Child вроде бы пуст

      Подскажите в чем может быть проблема
        твою проблему решит перенос инициализации полей в __init__, но почему так, я честно говоря затрудняюсь ответить, не большой я спец в Python

        Добавлено
        разобрался
        когда ты объявляешь поля так как сделал ты, то это то же самое что и объявление метода, то есть общее для всех экземпляров классов
        типа так
        ExpandedWrap disabled
          def some_func(self, a, b):
              return a+b
           
          class A:
              plus = some_func


        таким образом у тебя просто Child для обоих инстансов один и тот же, отсюда и бесконечный цикл, если атрибуты убрать и инициализировать переменные в __init__ проблем не будет, это уже будут атрибуты инстанса.
          XandoX Спасибо, помогло :)
            Проблема в том, что поле Child имеет мутабельное значение. Поэтому append работает с одной общей для всех объектов класса копией. Числовые поля в методах просто получают новые значения и после этого оказываются независимыми.

            Аналогично с аргументами функций. Если передать в функцию список и в функции к нему что-нибудь прицепить исходное значение тоже изменится.
            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0168 ]   [ 14 queries used ]   [ Generated: 14.05.24, 19:25 GMT ]