Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.129.217.191] |
|
Сообщ.
#1
,
|
|
|
Всем доброго времени суток
Начал изучать этот замечательный язык, но в первом hello world'e уткнулся в бесконечную рекурсию #!/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 вроде бы пуст Подскажите в чем может быть проблема |
Сообщ.
#2
,
|
|
|
твою проблему решит перенос инициализации полей в __init__, но почему так, я честно говоря затрудняюсь ответить, не большой я спец в Python
Добавлено разобрался когда ты объявляешь поля так как сделал ты, то это то же самое что и объявление метода, то есть общее для всех экземпляров классов типа так def some_func(self, a, b): return a+b class A: plus = some_func таким образом у тебя просто Child для обоих инстансов один и тот же, отсюда и бесконечный цикл, если атрибуты убрать и инициализировать переменные в __init__ проблем не будет, это уже будут атрибуты инстанса. |
Сообщ.
#3
,
|
|
|
XandoX Спасибо, помогло
|
Сообщ.
#4
,
|
|
|
Проблема в том, что поле Child имеет мутабельное значение. Поэтому append работает с одной общей для всех объектов класса копией. Числовые поля в методах просто получают новые значения и после этого оказываются независимыми.
Аналогично с аргументами функций. Если передать в функцию список и в функции к нему что-нибудь прицепить исходное значение тоже изменится. |