Рубрики
Без рубрики

Глубокое погружение в Python Scopes

Python имеет свой путь для обработки прицелов. Важно понять это, чтобы добраться до следующего уровня …. Tagged с Python, WebDev.

Python-Journey (4 серия части)

Python имеет свой путь для обработки прицелов. Важно понять это, чтобы добраться до следующего уровня.

Местный против глобального

Только глобальные переменные доступны в любом месте. Другие переменные принадлежат конкретной области программы.

Например, любая переменная, созданная внутри функции, является локальная переменная :

def mydef() :
    a = "ah"

Вы не можете получить доступ A За пределами локальной области mydef () Анкет Следующий код выбрасывает ошибку области:

def mydef() :
    a = "ah"

print(a)

Правильный код:

def mydef() :
    a = "ah"
    print(a)

mydef()

Вы можете подумать, что это относительно просто, но посмотрите на это:

a = "ah"

def mydef() :
    print(a)

mydef()

Это все еще работает? (Нажмите на стрелку, чтобы обнаружить ответ)

Отвечать Да! Я просто немного тебя дразню;)

Вот и увлекательная часть, посмотрите на следующий код сейчас:

count = 0

def mycount() :
    count = count + 1
    print(count)

mycount()

Это работает? (Нажмите на стрелку, чтобы обнаружить ответ)

Отвечать Нет! На этот раз вы получаете «Unboundlocalerror» с сообщением «локальная переменная», ссылаясь на назначение перед назначением ».

Мы рассмотрим этот случай в следующем разделе.

Понимание ошибки облада

Что, черт возьми, это «несущественный слой», который у нас есть?

Конечно, есть ошибка, но какой? Мы называем следующее задание:

count = count + 1

Поскольку мы выполнили это назначение внутри функции, компилятор рассматривает сейчас считать Как локальная переменная, больше не глобальная переменная. Вот почему вы получаете ошибку «локальная переменная», ссылаясь на назначение ». Компилятор читает считать прежде чем он будет назначен.

В Python 3 вы решаете эту проблему, явно сказав счет глобальная переменная:

count = 0

def mycount() :
    global count
    count = count + 1
    print(count)

mycount()

Немного больше о глобальных веществах

В предыдущем разделе мы увидели пример ошибки прицела. Теперь давайте посмотрим на следующее:

count = 1

def mycount() :
    print(count)

count += 110

mycount()
print(count)

Это работает? (Нажмите на стрелку, чтобы обнаружить ответ)

Отвечать Да!

У меня есть еще один вопрос для вас. Каков результат первого печати? (Нажмите на стрелку, чтобы обнаружить ответ)

Отвечать То же, что и второй отпечаток: 111.

Whaaaat ….?

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

Сначала это может показаться странным, но таким образом Python хочет предотвратить потенциальные нежелательные побочные эффекты.

Что такое нелокально?

Python 3 представил нелокальный утверждение для переменных, которые не являются ни локальными, ни глобальными.

Опять что …?

Вы бы использовали такие переменные, как правило, внутри вложенных функций:

def mydef() :
    a = "ah"

    def mynested() :
        nonlocal a
        a = "ho"

    mynested()

    return a

print(mydef())

В этом случае ни глобальное, ни локальное заявление не могут разрешить конфликт именования, но нелокальный Заявление может.

Правило LegB

Другой распространенный способ объяснения областей – сказать, что это контекст, в котором существуют переменные.

Интерпретатор Python считывает переменные в определенном порядке:

Local -> Окружение -> Global -> Встроенный

Каждая область вложена внутри другой сферы. Окончательная область-это встроенная область. Python поднимает nameerror, если он не нашел вашу переменную после изучения каждого уровня в этом конкретном порядке.

Источник

Бонус

Вы можете использовать встроенные функции Globals () и местные жители () «увидеть матрицу»:

def mydef() :
    a = "ah"

    def mynested() :
        nonlocal a
        a = "ho"

    mynested()

    print(locals())

    return a

mydef()

print(globals())

Который отображается для глобальных переменных:

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10c1f7550>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'scopes.py', '__cached__': None, 'mydef': }

и для местных переменных:

{'mynested': .mynested at 0x108d12048>, 'a': 'ho'}

Заворачивать

Надеюсь, вам понравился этот пост. Python имеет четыре сферы. Он читает ваши переменные в соответствии с правилом LEGB. Он обрабатывает местные и глобальные переменные довольно уникальным образом по сравнению с другими языками, такими как Java, или даже C.

ИМХО, это хороший дизайн.

Python-Journey (4 серия части)

Оригинал: “https://dev.to/jmau111/deep-dive-into-python-scopes-1786”