Найти - Пользователи
Полная версия: Зарезервированное слово «global» и «nonlocal»
Начало » Python для новичков » Зарезервированное слово «global» и «nonlocal»
1
IamDenis
Всем привет! Учусь потихоньку языку программированию python по книге “A Byte of Python” и дочитал уже до пункта, указанного в заголовке темы, вот у меня вопрос:
Насколько я понял, в пункте про “Зарезервированное слово «global»” говорят о том, что можно переменную объявленную в функции, объявить глобальной, как я понял в таком случае, значение её переменной будет доступно в любых других функциях? Тогда чем она отличается от переменных объявленных во внешнем блоке? Почему просто не вынести эту переменную во внешний блок и все?
И если кто может объясните про nonlocal тоже, спасибо!
doza_and
IamDenis
Почему просто не вынести эту переменную во внешний блок и все?
Потому что в питоне явное лучше неявного.
 a=1
def fun1():
    print(a)
def fun2():
    a+=1
fun1()
fun2()
>>> 
1
Traceback (most recent call last):
  File "<editor selection>", line 7, in <module>
  File "<editor selection>", line 5, in fun2
UnboundLocalError: local variable 'a' referenced before assignment
Питон мог бы неявно подумать что переменная глобальная, но он хочет явного указания. Но почему то только для модификации.
IamDenis
кто может объясните про nonlocal
 a=1
def fun1():
    a=2
    def fun2():
        nonlocal a
        print("nonlocal",a)
    def fun3():
        global a
        print("global in",a)
    def fun4():
        print("none",a)
    fun2()
    fun3()
    fun4()
print("global",a)
fun1()
>>> 
global 1
nonlocal 2
global in 1
none 2

Все это определенные заплатки. Как например в одной функции одновременно мспользовать local global? Как указать переменную на нужном уровне вложенности? Обычно в модуле не должно вообще быть глобальных переменных. За последний год я ни разу не использовал global или nonlocal. И вам не советую
py.user.next
IamDenis
говорят о том, что можно переменную объявленную в функции, объявить глобальной, как я понял в таком случае, значение её переменной будет доступно в любых других функциях?
Да, будет.

IamDenis
Тогда чем она отличается от переменных объявленных во внешнем блоке?
Тем, что ты её сможешь менять (менять её значение) внутри той функции, где она объявлена. А у просто объявленной снаружи ты сможешь только читать значение внутри функции.

Ты вот прочитай эти два материала
python.org. global
python.org. nonlocal
И забудь про них навсегда, потому что пользоваться ты ими никогда не будешь.
Это как оператор goto в языке C: он есть там, но им пользуются очень редко и только в суперпрофессиональных кодах, которые проламывают границу того, что есть правильно, на уровне кротовой норы в пространстве Вселенной.

В нормальном коде не должно быть ни global, ни nonlocal. Только в академической хрени они могут понадобиться. Но ты же не академик?
IamDenis
Понял, принял господа.
От души благодарю за объяснение!

p.s: Что скажете насчет книги “Майкл Доусон - Программируем на Пайтон”, я её тоже начинал читать, совсем немного, но там столько “воды”, что, чтение этой книги мне не приносило особого удовольствия, а наоборот, мне приходилось применять силу воли, чтобы продолжать. Однако там есть задачки для самопроверки, которых нет в книге которую я читаю сейчас, но нынешняя книга в чтении гораздо приятней.
Просто хотел спросить у вас совет, что думаете по этой книге?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB