LINUX.ORG.RU

Ответ на: комментарий от I-Love-Microsoft

Буду немного больше представлять логику принятия странных решений создателей питона?

А то пока непонятно, почему бы тогда не выкинуть False из этого списка, и оставить только True? Почему не выкинуть else, и оставить только if? Почему бы не выкинуть in, и оставить только for?

Что не так со словом local? Чем global и nonlocal лучше?

utrack ()
Ответ на: комментарий от utrack

Так решение не странное и достаточно понятное. Переменные в питоне использовались без предварительной декларации, без ключевых слов. Потом пацаны захотели иметь доступ к переменным из внешнего окружения функции и пришлось ввести новый способ это сделать — декларацию с помощью нового ключевого слова global.
Все. Просто. Разве нет?

urxvt ★★★★★ ()
Ответ на: комментарий от urxvt

У этого решения есть свои недостатки.

def foo(x):
    result = []
    for bar in x:
        def nested(baz):
            return bar + baz
        result.append(nested)
    return result

Чтобы нормально захватить bar как переменную цикла, а не глобальную переменную в функции, нужно будет впилить офигенный костыль. Если бы можно было сделать for local bar, это было бы заметно проще.

В том же жабоскрипте давно сделали block-scope переменные примерно для таких целей, в том числе потому, что (было) там дофига коллбэков. В питонах их до сих нет.

x3al ★★★★★ ()
Ответ на: комментарий от AntonI

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

Вот смотрю я примеры, и вижу внутри функции переменной присваивают статус local, т.е. это слово имеет определенный функционал в питоне.

https://www.programiz.com/python-programming/global-local-nonlocal-variables

Почему я тогда могу спокойно создать переменную с именем local?

utrack ()
Ответ на: комментарий от utrack

Тогда вообще непонятно, какой статус имеет слово local в питоне?

Никакого.

Только что создал переменную с именем local. Разве это не странно?

Нет.

Это должно быть зарезервированным словом…

Кому должно?

wandrien ()
Ответ на: комментарий от wandrien

Никакого.

Как это никакого? Вот один из примеров по ссылке.

Example 5: Global variable and Local variable with same name

x = 5

def foo():
    x = 10
    print("local x:", x)


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

Т.е. переменная явно задается сначала как локальная, потом глобальная. Значит local это не простое слово. Какой у него статус в питоне? И почему оно может быть именем переменной?

utrack ()
Ответ на: комментарий от utrack

Т.е. переменная явно задается сначала как локальная, потом глобальная.

Ты в тексте где-нибудь видишь, что переменная задаётся при помощи слов local или global? Вот и я не вижу. Потому что такого там нет.

Значит local это не простое слово.

Просто слово. Можешь использовать под название переменной, если нужно.

wandrien ()
Ответ на: комментарий от utrack

Тогда вообще непонятно, какой статус имеет слово local в питоне?

никакого.

Это должно быть зарезервированным словом…

Кому должно?

Вот смотрю я примеры, и вижу внутри функции переменной присваивают статус local

Не статус а значение «local» - это просто строка.

AntonI ()
Ответ на: комментарий от AntonI

Т.е. слово «local» не имеет вообще никакой силы в питоне, потому что все переменные по умолчанию локальные? А используется это слово в примерах, чтобы просто показать «локальность» переменной?

utrack ()
Ответ на: комментарий от utrack

Всё просто, архитектура была без задела на будущее раньше не было глобала потом добавили поломав тучу софта и так далее. Подумав заранее о резервировании слов на будущее ума у того самого не хватило. Убогая архитекстура вот и всё. Тут нет никакой тайны. Завтра они зарезервируют это слово, сломав ещё кучу софта. Тоесть когда захотят тогда и объявят это слово ключевым.

anonymous ()
Ответ на: комментарий от wandrien

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

utrack ()
Ответ на: комментарий от anonymous

Завтра они зарезервируют это слово, сломав ещё кучу софта.

Да вот не знаю, а есть тогда вообще смысл добавлять, раз и так нормально? Вот другой пример смотрю, вроде все понятно. Сказали внутренней функции, что переменная «x» нелокальная, и все заработало...

def nonlocalExample():
    # x - локальная внутри localExample()
    x = 5

    def innerFunc():
        nonlocal x
        x = x + 1
        return x

    return innerFunc()


print(nonlocalExample())
> 6
utrack ()

PEP по nonlocal содержит ответ на твой вопрос. Если коротко: потому что есть переменные с названием «local», но почти нет переменных с названием «nonlocal». Обычные причуды языка без спецификации.

byko3y ★★ ()
Ответ на: комментарий от utrack

Дальше к психологу

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

router ★★★★★ ()

Да надо было вообще все слова не длиннее 6 букв сделать зарезервированными. Тогда и парсер упрощается, и кодеру проще жить. Сейчас пишешь идентификатор и думаешь: так, короткое слово, вполне вероятно, что эти идиоты его уже зарезервировали. А так знали бы наверняка.

bread ()

Изучал тут список ключевых слов, и обнаружил, что nonlocal является ключевым словом, а local - нет. Почему так?

Потому что такого слова в языке нет.

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

anonymous ()
Ответ на: комментарий от x3al

Если бы можно было сделать for local bar, это было бы заметно проще.

Тут дело не в локальности. А в том, что у переменной меняется значение.

Вы путаете «захват переменной» и «захват текущего значения этой переменной».

Чтобы нормально захватить bar как переменную цикла, а не глобальную переменную в функции, нужно будет впилить офигенный костыль.

Есть стандартный способ захватить значение переменной, вместо самой переменной:

def foo(x):
    result = []
    for bar in x:
        def nested(baz, captured_value=bar):
            return captured_value + baz
        result.append(nested)
    return result

anonymous ()