Используя должностное лицо () с рекурсивными функциями

Вы можете использовать этот синтаксис:

let subject = Object.assign({}, obj}
console.log(subject)

или

let subject = {};
Object.assign(subject, obj);
console.log(subject)
5
задан Headcrab 16 May 2009 в 07:56
поделиться

4 ответа

У меня работает:

a = """\
def rec(n):
    if n > 10:
        return
    print n
    return rec(n+1)

rec(5)"""

exec(a)
5
6
7
8
9
10

Все, что я могу сказать, это, вероятно, ошибка в вашем коде.

Изменить

Вот,

def fn1():
    glob = {}
    a = """\
def rec(n):
    if n > 10:
        return
    print n
    return rec(n+1)

rec(5)"""
    exec(a, glob)

fn1()
4
ответ дан 13 December 2019 в 19:34
поделиться

Это меня тоже сначала удивило и кажется странным случаем, когда exec действует не совсем как определение верхнего уровня или определение внутри включающей функции. Похоже, что происходит то, что определение функции выполняется в переданном вами locals () dict. Однако определенная функция на самом деле не имеет доступа к этому locals dict.

Обычно, если вы определяете функцию в верхний уровень, локальные и глобальные переменные одинаковы, поэтому функции видны внутри, потому что они могут видеть функцию в глобальных.

Когда функция определена в области действия другой функции, python заметит, что доступ к ней осуществляется внутри функции, и создайте замыкание, чтобы "лошадь" отображалась на привязку во внешней области видимости.

Здесь это странный случай на полпути. exec действует так, как будто определения находятся на верхнем уровне, поэтому закрытие не создается. Однако, поскольку locals - это не то же самое, что globals, определение не идет туда, где функция может получить к нему доступ - оно определено только в недоступном внешнем locals dict.

Есть несколько вещей, которые вы можете сделать:

  1. Используйте один и тот же словарь для локальных и глобальных переменных. т.е. " exec s в locals (), locals () " (или лучше, просто используйте свой собственный dict). Предоставление только команды globals () имеет тот же эффект, то есть « exec s в mydict »

    1. Используйте один и тот же словарь для локальных и глобальных переменных. т.е. " exec s в locals (), locals () " (или лучше, просто используйте свой собственный dict). Предоставление только команды globals () имеет тот же эффект, то есть « exec s в mydict »

      1. Используйте один и тот же словарь для локальных и глобальных переменных. т.е. " exec s в locals (), locals () " (или лучше, просто используйте свой собственный dict). Предоставление только команды globals () имеет тот же эффект, то есть « exec s в mydict » #
      2. Поместите функцию внутрь ее собственной функции, чтобы было создано замыкание. например,

         s = "" "
        def go ():
         def factorial (x):
         если x == 0: вернуть 1
         вернуть x * факториал (x-1)
         печать факториала (10)
        идти()"""
        
      3. Заставьте функцию переходить в globals (), а не в локальные переменные, поместив директиву global funcname, как это было предложено в ответе Стефана

4
ответ дан 13 December 2019 в 19:34
поделиться

У меня это работает (добавлено global rec ). rec (5) вызывает локальную запись rec , но rec (n + 1) вызывает глобальную запись (которой не существует) без нее.

def fn1():
    a = """global rec
def rec(n):
    if n > 10:
        return
    print n
    return rec(n+1)

rec(5)"""

    exec(a)
]
3
ответ дан 13 December 2019 в 19:34
поделиться

«NameError: глобальное имя 'rec' не определено» означает, что он ищет rec в глобальной, а не локальной области. Похоже, он определяет rec в локальной области, но затем пытается выполнить в глобальной. Попробуйте напечатать locals () и globals () в строке, которую вы выполняете.

Подробнее.

0
ответ дан 13 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: