def outer():
    x = "outer"
    def inner():
        nonlocal x
        x = "inner"
    inner()
    return x
print(outer())
outer определяет переменную x с начальным значением "outer". Внутри outer определяется функция inner.  inner использует ключевое слово nonlocal для изменения переменной x, объявленной во внешней области видимости (в outer). После вызова inner() значение x в outer становится "inner". Затем outer возвращает текущее значение x. Таким образом, функция print выведет "inner".
Разберем код построчно, чтобы понять, что будет выведено в консоль.
1.  def outer():: Определяется внешняя функция outer.
2.  x = "outer":  Внутри outer, переменной x присваивается значение "outer".  x находится в области видимости функции outer.
3.  def inner():: Определяется внутренняя функция inner.
4.  nonlocal x:  Ключевое слово nonlocal указывает, что переменная x, к которой обращаются в функции inner, не является локальной для inner.  Вместо этого, она относится к ближайшей внешней области видимости, в которой определена переменная с таким же именем.  В данном случае, это переменная x, определенная в функции outer.
5.  x = "inner":  Переменной x (которая, как мы определили с помощью nonlocal, относится к переменной во внешней функции outer) присваивается значение "inner".  Это *изменяет* значение переменной x в области видимости функции outer.
6.  inner():  Вызывается функция inner.  К моменту вызова функции inner, в ней изменяется значение переменной x, объявленной во внешней функции outer. 
7.  return x: Функция outer возвращает значение переменной x. Поскольку функция inner изменила значение x на "inner", функция outer возвращает "inner".
8.  print(outer()):  Вызывается функция outer, возвращаемое значение которой ("inner") выводится в консоль.
Таким образом, результатом выполнения кода будет вывод:
inner