Нелокально ли то же самое, что и stati c? - PullRequest
2 голосов
/ 29 апреля 2020

В python у нас есть ключевое слово nonlocal. Это так же, как static в C ++? Если у нас есть вложенные функции в python, вместо того, чтобы использовать нелокальную внутреннюю функцию, можем ли мы просто объявить переменную во внешней функции? Таким образом, это будет действительно nonlocal.

Пояснение: static ключевое слово, как используется ниже в C ++:


#include <iostream>
int foo () {
   static int sVar = 5;
   sVar++;
   return sVar;
}

using namespace std;
int main () {
   int iter = 0;
   do {
       cout << "Svar :" foo() << endl;
       iter++;
   } while (iter < 3); 
} 

дает вывод за итерации:

Svar :6
Svar :7
Svar :8

Итак, Свар сохраняет свою ценность.

Ответы [ 3 ]

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

Если у нас есть вложенные функции в python, вместо того, чтобы использовать нелокальную внутреннюю функцию, можем ли мы просто объявить переменную во внешней функции?

Нет. Если вы пропустите nonlocal, присваивание во внутренней функции создаст новую локальную копию, игнорируя объявление во внешнем контексте.

def test1():
    x = "Foo"
    def test1_inner():
        x = "Bar"
    test1_inner()
    return x

def test2():
    x = "Foo"
    def test2_inner():
        nonlocal x
        x = "Bar"
    test2_inner()
    return x

print(test1())
print(test2())

... испускает:

Foo
Bar

Это то же самое, что и stati c в C ++?

C ++ static переменные на самом деле являются просто глобальными переменными с более узкой областью действия (т. Е. Они представляют собой постоянный глобальный контекст, который хранится в вызовах функций).

Python nonlocal почти о вложенном разрешении области видимости; отсутствует глобальное постоянство при вызовах внешней функции (но было бы при многократных вызовах внутренней функции из одного и того же вызова внешней функции).

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

Мое понимание static в C ++ состоит в том, что оно может принимать несколько значений.

Я понимаю, что вы понимаете под "static в C ++" - это переменная, которая поддерживает состояние между вызовами. Самая близкая вещь в python - это переменная global.

nonlocal ограничивает время жизни значения во вложенной функции тем же, что и у функции включения. Это компромисс между global и local.

Если вы пропустите nonlocal во внутренней функции, то переменная там будет иметь ту же область действия и время жизни, что и внутренняя функция. Если, конечно, вы читали и не писали это, в этом случае это соответствовало бы объему функции включения, но не служило для поддержания какого-либо состояния из внутренней функции.

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

"нелокальный" не является c. Рассмотрим следующий пример

def outer():
    x = "local"

    def inner():
        nonlocal x
        x = "nonlocal"
        print("inner:", x)

    inner()
    print("outer:", x)


def foo():
    foo.counter += 1
    print("Counter is", foo.counter)

outer()
foo.counter = 0

foo()
foo()
foo()

Вывод этого кода будет выглядеть следующим образом: нелокальный внешний: нелокальный счетчик равен 1 Счетчик равен 2 Счетчик равен 3

Переменная foo.counter является эквивалент ключевого слова stati c в C ++. Надеюсь, это поможет.

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