Форум сайта python.su
3
Есть функция:
def qwe(lst, new = []): for el in lst: qwe(el) if isinstance(el, list) else new.append(el) return new При таком раскладе получаю: a = qwe([1, [2, 3, [4, 5]]]) print a [1, 2, 3, 4, 5]
def qwe(lst): new = [] for el in lst: qwe(el) if isinstance(el, list) else new.append(el) return new a = qwe([1, [2, 3, [4, 5]]]) print a [1]
def qwe(lst): global new new = [] for el in lst: qwe(el) if isinstance(el, list) else new.append(el) return new a = qwe([1, [2, 3, [4, 5]]]) print a [4, 5]
Офлайн
24
В первом варианте у Вас есть значение по умолчанию, которое фиксируется. Внутри функции Вы его изменяете и каждый новый вызов у функции новое значение по умолчанию. Во втором случае у Вас функция внутри цикла не связана ни с какой переменной. Т.е. она выполняеться но наверх результаты не дает.
Офлайн
3
В последнем варианте, значит, каждый раз создаётся новая глобальная переменная new, поэтому в ней и остаются значения с последнего шага цикла.
Вроде разобрался, спасибо.
Офлайн
24
Ну вот смотрите :
>>> import inspect >>> def some_func(a, b=[]): ... b.append(a) ... return b ... >>> inspect.getargspec(some_func) ArgSpec(args=['a', 'b'], varargs=None, keywords=None, defaults=([],))
>>> some_func(1) [1] >>> some_func(2) [1, 2] >>> inspect.getargspec(some_func) ArgSpec(args=['a', 'b'], varargs=None, keywords=None, defaults=([1, 2],)) >>>
Отредактировано ayb (Окт. 24, 2015 20:03:17)
Офлайн
3
Очень подробно,но не стоило, я после первого ответа врубился.
Ещё раз благодарю
aybЕсли честно, это найдено было в сети, а в чем именно её херовость?
PS : вообще объявлять функцию вот так функцию как у Вас в первом примере очень херовая практика.
Офлайн
24
Офлайн
3
Ну там как бэ не написано, что такая практика херова.
Там написано “важное предупреждение” и далее про то, что с изменяемыми объектами функция будет вести себя вот так.
Далее мысль о том, что уж если вам не нужно такое поведение, можете сделать по- другому(передать None).
То есть, по сути, просто описание без оценочных суждений.
Просто мне кажется, что чел, писавший эту функцию, понимал что он делает и для чего..
Офлайн
39
Я вот вижу global в коде и его принципиально не использую. И мне как-бы серенево, понимает его создатель, зачем нужен global или нет 
P.S. Хотите писать код, который не будут заворачивать техлид или тимлид - не используйте такие конструкции. Ну и global в том числе.
Офлайн
3
4kpt_IIIТак мы с ayb и не global обсуждали вовсе..Про её использование я в курсе, это так, эксперимент был
P.S. Хотите писать код, который не будут заворачивать техлид или тимлид - не используйте такие конструкции. Ну и global в том числе.

Офлайн
16
Когда-то примерно то же самое спрашивал
Офлайн