Python нелокальный оператор

Промежуток может использоваться для добавления семантического значения, которое выходит за пределы объема HTML. Это может быть сделано при помощи классов, которые определяют определенные атрибуты. Например, если Вы пишете научно-фантастический роман, можно использовать промежуток для идентификации искусственных слов, потому что можно хотеть отформатировать тех по-другому, или потому что можно хотеть, чтобы программа проверки правописания проигнорировала их:

Тогда мастер призвал < класс промежутка = "wizardword"> gravenwist< / промежуток> и предложил его, нападают на приближающуюся армию. < класс промежутка = "wizardword"> gavenwist< / промежуток> сопротивлявшийся, но < мастера; класс промежутка = "wizardword"> wistwand< / промежуток> было слишком мощно.

Это могло представить как

Тогда, мастер призвал gravenwist и предложил его, нападают на приближающуюся армию. gavenwist, которому сопротивляются, но мастер , wistwand был слишком мощен.

Другой хороший пример этого вида вещи микроформаты , которые позволяют создание произвольной структуры в HTML:


 home:
 +1.415.555.1212

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

292
задан einpoklum - reinstate Monica 10 April 2015 в 22:20
поделиться

3 ответа

Сравните это, без использования нелокального :

x = 0
def outer():
    x = 1
    def inner():
        x = 2
        print("inner:", x)

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

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

# inner: 2
# outer: 1
# global: 0

С этим, используя нелокальный , где inner () 's x теперь также external () s x :

x = 0
def outer():
    x = 1
    def inner():
        nonlocal x
        x = 2
        print("inner:", x)

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

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

# inner: 2
# outer: 2
# global: 0

Если бы мы использовали global , он бы связал x в правильное "глобальное" значение:

 x = 0
def external ():
 х = 1
 def inner ():
 глобальный x
 х = 2
 print ("внутренний:", x)

 внутренний ()
 print ("внешний:", x)

внешний ()
print ("глобальный:", x)

# внутренний: 2
# внешний: 1
# глобальный: 2
414
ответ дан 23 November 2019 в 01:40
поделиться

При поиске в Google по запросу "python nonlocal" было обнаружено Предложение PEP 3104 , которое полностью описывает синтаксис и обоснование этого утверждения. Короче говоря, он работает точно так же, как оператор global , за исключением того, что он используется для ссылки на переменные, которые не являются ни глобальными, ни локальными для функции.

Вот краткий пример того, что вы можете с этим сделать. Генератор счетчиков можно переписать, чтобы использовать это так, чтобы он больше походил на идиомы языков с замыканиями.

def make_counter():
    count = 0
    def counter():
        nonlocal count
        count += 1
        return count
    return counter

Очевидно, вы могли бы написать это как генератор, например:

def counter_generator():
    count = 0
    while True:
        count += 1
        yield count

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

39
ответ дан 23 November 2019 в 01:40
поделиться

Короче говоря, он позволяет вам присваивать значения переменной во внешней (но неглобальной) области. См. PEP 3104 для всех кровавых подробностей.

80
ответ дан 23 November 2019 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: