Есть ли способ использовать переменную в функции из внутренней функции - PullRequest
2 голосов
/ 29 апреля 2020

У меня есть такой фрагмент кода:

def A():
  def B():
    c.append("hello")
    d = 8

  c = []
  d = 0

  B()

  print(c, d)

Я получаю этот вывод:

["hello", 0]

Я хочу, чтобы функция B достигала c и d из функции A. Он достигает c, потому что это list, но я также хочу достичь d с B. Есть ли простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Объявите d как nonlocal. Это сделает ячейку «доступной для записи» из внутренней функции.

c работает, потому что вы изменяете объект на месте, однако «неявное объявление» Python (присваивание переменной ) всегда объявляет имена в локальной области . Поэтому, когда вы пытаетесь обновить нелокальную или глобальную переменную, вместо этого происходит то, что переменная с тем же именем объявляется как локальная функция.

Операторы global и nonlocal переопределяют эту неявную объявление, и вместо этого объявить, что переменная (и) указанного имени (ей) соответственно глобальны для модуля или в некоторой области действия функции, а не локальны для функции. Назначения будут затем «перенесены» в надлежащую область, а не явным образом вызовут объявление локальной переменной.

0 голосов
/ 29 апреля 2020

Одним простым подходом Python3 будет прямой доступ к локальной переменной функции, как показано ниже.

def A():
    def B():
        c.append("hello")
        A.d = 8  # <<

    c = []
    d = 0

    B()
    print(c, A.d)  # <<
A()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...