LINUX.ORG.RU

Может быть потому, что «local» — это не ключевое слово?

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

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

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

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

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

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

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

Для меня это как бы 3 сущности из одной темы. Почему 2 удостоились стать ключевыми словами, а 1 нет - загадка.

utrack
() автор топика
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от urxvt

Мне скучно от таких как ты, кто готов схавать любые решения и тупо выполнять инструкции, не задавая лишних вопросов.

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

Да, похоже, тут с простотой переборщили.

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

Потому что одна из трех сущностей всегда включена по умолчанию. Все что не глобал и не нонлокал - все локал.

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

Вряд ли. Думаю, новое поколение подрастает ему на смену.

wandrien ★★
()
Ответ на: комментарий от 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

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

Ничего такого там нет.

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

Я вижу что слова local и global меняют статус переменной. Но почему-то одно является ключевым зарезервированным словом, а другое нет. Где логика то?

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

Я вижу что слова local и global меняют статус переменной.

А ветер от того, что деревья качаются?

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

Я вижу что слова local и global меняют статус переменной.

Лол. Это просто строки, которые программа выводит на терминал.

Где логика то?

Нету логики, ты код читать не умеешь.

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

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

никакого.

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

Кому должно?

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

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

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

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

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

Попробуй metaprog. Бывалые говорят, что python ему в подметки не годится.

anonymous
()
Ответ на: комментарий от 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
()
Ответ на: комментарий от utrack

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

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

Анонимус же ненавидел питон и был сначала сишником, а потом жабаскриптером(или наоборот, я уже не помню)

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

какой статус имеет слово local в питоне?

А какой статус имеет в питоне слово arkady_ukupnik? Требую статус ключевого слова!

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

раньше не было глобала потом добавили поломав тучу софта

А когда же по-твоему добавили global и nonlocal в питон?

Aswed ★★★★★
()

Изучал тут список ключевых слов, и обнаружил, что 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
()

Потому же, почему среди них нет donotreturn.

t184256 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.