Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 12, 2021 02:48:51

IamDenis
Зарегистрирован: 2021-12-12
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Зарезервированное слово «global» и «nonlocal»

Всем привет! Учусь потихоньку языку программированию python по книге “A Byte of Python” и дочитал уже до пункта, указанного в заголовке темы, вот у меня вопрос:
Насколько я понял, в пункте про “Зарезервированное слово «global»” говорят о том, что можно переменную объявленную в функции, объявить глобальной, как я понял в таком случае, значение её переменной будет доступно в любых других функциях? Тогда чем она отличается от переменных объявленных во внешнем блоке? Почему просто не вынести эту переменную во внешний блок и все?
И если кто может объясните про nonlocal тоже, спасибо!

Офлайн

#2 Дек. 12, 2021 09:16:52

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Зарезервированное слово «global» и «nonlocal»

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. И вам не советую



Офлайн

#3 Дек. 12, 2021 09:19:31

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Зарезервированное слово «global» и «nonlocal»

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

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

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

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



Отредактировано py.user.next (Дек. 12, 2021 09:22:27)

Офлайн

#4 Дек. 12, 2021 09:37:20

IamDenis
Зарегистрирован: 2021-12-12
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Зарезервированное слово «global» и «nonlocal»

Понял, принял господа.
От души благодарю за объяснение!

p.s: Что скажете насчет книги “Майкл Доусон - Программируем на Пайтон”, я её тоже начинал читать, совсем немного, но там столько “воды”, что, чтение этой книги мне не приносило особого удовольствия, а наоборот, мне приходилось применять силу воли, чтобы продолжать. Однако там есть задачки для самопроверки, которых нет в книге которую я читаю сейчас, но нынешняя книга в чтении гораздо приятней.
Просто хотел спросить у вас совет, что думаете по этой книге?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version