Pull to refresh

Comments 2

Между прочим, прошу людей, глубоко понимающих семантику языка Python, разъяснить вопрос, возникающий в связи с реализацией на питоне седьмого способа. Буквально это можно сделать так:

def f (n1, n2):
  global f
  if n1 >= n2:
    f = lambda n1, n2 : 0
  print (n1)
  f (n1+1, n2)

Это работающий код. Без оператора global во второй строке он работать не будет, так как парадоксальным образом имя функции исходно не находится в её лексическом контексте. Мы получим сообщение об отсутствии значения у имени f. Но как же тогда вообще возможен без оператора global рекурсивный вызов в шестой строке? Ведь мы точно так же обращаемся в нём к имени f?

Меня интересует именно объяснение этого обстоятельства с точки зрения семантики языка, а не то, как это реализовано.

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

Sign up to leave a comment.

Articles