Python: Функции, в которых генерируется переменная с тем же именем ввода - PullRequest
0 голосов
/ 08 декабря 2018

Извиняюсь за возможную путаницу по поводу названия.Я приложу все усилия, чтобы проиллюстрировать мой вопрос.

Контекст:

Я только что закончил работу над интересной проблемой кодирования на CodeWars , где меня попросили написать функцию дляупростить список направлений.

Ввод будет выглядеть как ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]

'SOUTH' 'NORTH' и 'EAST' 'WEST', которые находятся рядом друг с другом, должны быть удалены, так как не имеет смысла идти на север, а затем сразу на юг,И список должен быть упрощен до тех пор, пока он не может быть упрощен.

Например:

["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]

должен быть упрощен до

['WEST']

Dummy OP написал aнеуклюжая функция, которая делает это.Но мой вопрос о действительно умном ответе, опубликованном кем-то другим.

Код:

def dirReduc(arr):
    dir = " ".join(arr)
    dir2 = dir.replace("NORTH SOUTH",'').replace("SOUTH NORTH",'').replace("EAST WEST",'').replace("WEST EAST",'')
    dir3 = dir2.split()
    return dirReduc(dir3) if len(dir3) < len(arr) else dir3

Я поиграл с ним и увидел, что он работает, но просто не мог понять, как,

Я вижу, что в операторе return он будет выполняться снова, если результат не будет иметь ту же длину, что и input, что понятно.Но в коде используется dirReduc(dir3), что мне кажется неправильным.

Если я запускаю dirReduc(dir3), тогда мой ввод будет dir3, но затем внутри фрейма функции будет создан другой dir3.Поэтому теперь, когда функция переходит к окончательному оператору возврата, она должна быть return dirReduc(dir3) if len(dir3) < len(dir3) else dir3.А так как len(dir3) == len(dir3)', it will just return dir3`.

В моем понимании, функция будет запускаться дважды, максимум с каждым входом, что не соответствует действительности.Так какая часть моего понимания неверна?

Извините за огромное количество слов, я думаю, в конце концов, это простая проблема.Там должно быть очень фундаментальное, что я ошибаюсь.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Это базовая концепция.Каждая функция имеет свой собственный стек или, скажем, область видимости.

Вы можете изобразить, что функция является коробкой.Локальные переменные находятся внутри коробки.Так что если есть много функций, то есть много полей.Каждый блок имеет свои локальные переменные.Это как:

BoxA
--variable_a
BoxB
--varibale_a

Хотя эти две переменные имеют одно и то же имя, они находятся в разных полях.Так что они вообще разные варибалы.

Кроме того, BoxA (на самом деле функция A) не может получить доступ к переменной_a в BoxB, она находится за пределами своей области видимости, поэтому безопасно, даже если эти две переменные имеют одинаковое имя.

0 голосов
/ 08 декабря 2018

Локальные переменные в разных фреймах стека совершенно не связаны друг с другом, даже если они имеют одно и то же имя.Каждый рекурсивный вызов создает новый кадр стека, поэтому dir3 в одном вызове полностью отличается от dir3 в другом.

Представьте, что у вас есть нерекурсивная функция, которая сокращает путь только на один шаг:

def dirReducOneStep(arr):
    dir = " ".join(arr)
    dir2 = dir.replace("NORTH SOUTH",'').replace("SOUTH NORTH",'').replace("EAST WEST",'').replace("WEST EAST",'')
    dir3 = dir2.split()
    return dir3

print(dirReducOneStep(dirReducOneStep(dirReducOneStep(path))))

Единственное отличие состоит в том, что dirReduc вызывает себя по сокращенному пути, вместо того, чтобы заставлять вызывающего абонента решать, следует ли снова вызывать его на предыдущем выходе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...