Я не спрашиваю о правилах Python; Я вообще понимаю, как работает цикл в Python для циклов. Мой вопрос, почему дизайнерские решения были приняты таким образом. Например (не каламбур):
for foo in xrange(10):
bar = 2
print(foo, bar)
Выше будет напечатано (9,2).
Это кажется мне странным: 'foo' на самом деле просто контролирует цикл, а 'bar' был определен внутри цикла. Я могу понять, почему может быть необходимо, чтобы 'bar' был доступен вне цикла (в противном случае цикл имел бы очень ограниченную функциональность). Я не понимаю, почему управляющая переменная должна оставаться в области видимости после выхода из цикла. По моему опыту, это просто загромождает глобальное пространство имен и усложняет отслеживание ошибок, которые могут быть обнаружены переводчиками на других языках.
for
цикл загромождал ваше глобальное пространство имен, поместите его в функцию. Затворы в изобилии!Ответы:
Наиболее вероятный ответ заключается в том, что она просто сохраняет грамматику простой, не была камнем преткновения для принятия, и многие были довольны тем, что ей не приходилось однозначно определять область действия, которой принадлежит имя при назначении ему в конструкции цикла. Переменные не объявляются в области видимости, это подразумевается расположением операторов присваивания.
global
Ключевое слово существует только по этой причине (для обозначения , что назначение делается в глобальном масштабе).Обновить
Вот хорошая дискуссия на эту тему: http://mail.python.org/pipermail/python-ideas/2008-October/002109.html
Короче говоря, вы можете винить в этом сообщество Python: P
источник
Python не имеет блоков, как и некоторые другие языки (такие как C / C ++ или Java). Следовательно, область видимости в Python является функцией.
источник
for
циклы видимости являются естественным продолжением общего принципа. В Python это должен быть особый случай, и особых случаев следует избегать, если они не имеют убедительных преимуществ.Действительно полезный случай для этого при использовании,
enumerate
и вы хотите, чтобы общее количество в конце:Это необходимо? Нет, но это конечно удобно.
Еще одна вещь, о которой нужно знать: в Python 2 переменные в списках также просочились:
Но то же самое не относится к Python 3.
источник
else
пункте, т.е.else: print "I did something {0} times".format(count)
- до исчезновения локальной области видимости (которой нет в Python)someiterator
пусто?else
в этом случае можно использовать предложение, оно не будет работать вообще, так как тело цикла можетbreak
преждевременно.Если у вас есть оператор break в цикле (и вы хотите использовать значение итерации позже, возможно, чтобы выполнить резервное копирование, индексировать что-либо или присвоить статус), это сэкономит вам одну строку кода и одно присваивание, так что есть удобство.
источник
Одним из основных факторов, влияющих на Python, является ABC , язык, разработанный в Нидерландах для обучения программированию концепций для начинающих. Создатель Python, Гвидо ван Россум, несколько лет работал над ABC в 1980-х годах. Я почти ничего не знаю о ABC, но так как он предназначен для начинающих, я полагаю, что он должен иметь ограниченное количество областей, так же, как ранние Бейсики.
источник
Для начала, если бы переменные были локальными для циклов, эти циклы были бы бесполезны для большинства реальных программ.
В текущей ситуации:
доходность
45
. Теперь рассмотрим, как работает назначение в Python. Если переменные цикла были строго локальными:дает
0
, потому чтоtotal
внутри цикла после присваивания не та же переменная, что иtotal
вне цикла. Это не было бы оптимальным или ожидаемым поведением.источник
total
иfoo
в сценарии ОП все равно будут локальные привязки петли, и логика та же.