Вопрос-Ответ

Scoping in Python 'for' loops

Определение области видимости в циклах Python 'for'

Я не спрашиваю о правилах определения области видимости в Python; Я в целом понимаю, как работает определение области видимости в циклах Python for. Мой вопрос в том, почему проектные решения были приняты именно таким образом. Например (без каламбура):

for foo in xrange(10):
bar = 2
print(foo, bar)

Вышеизложенное выведет (9,2).

Это кажется мне странным: 'foo' на самом деле просто управляет циклом, а 'bar' был определен внутри цикла. Я могу понять, почему может быть необходимо, чтобы 'bar' был доступен вне цикла (в противном случае циклы for имели бы очень ограниченную функциональность). Чего я не понимаю, так это зачем управляющей переменной оставаться в области видимости после завершения цикла. По моему опыту, это просто загромождает глобальное пространство имен и затрудняет отслеживание ошибок, которые могли бы быть обнаружены интерпретаторами на других языках.

Переведено автоматически
Ответ 1

Наиболее вероятный ответ заключается в том, что он просто упрощает грамматику, не был камнем преткновения при внедрении, и многие были довольны тем, что не нужно устранять неоднозначность области видимости, к которой принадлежит имя, при присвоении ему в конструкции цикла. Переменные не объявляются в пределах области видимости, это подразумевается расположением операторов присваивания. Ключевое слово global существует именно по этой причине (для обозначения того, что присвоение выполняется в глобальной области видимости).

Обновить

Вот хорошее обсуждение по теме: http://mail.python.org/pipermail/python-ideas/2008-October/002109.html


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


Короче говоря, вы, вероятно, можете обвинить в этом сообщество Python :P

Ответ 2

В python нет блоков, как в некоторых других языках (таких как C / C ++ или Java). Следовательно, единица измерения области видимости в python - это функция.

Ответ 3

Для этого есть действительно полезный случай, когда используется enumerate и вы хотите получить общее количество в конце:

for count, x in enumerate(someiterator, start=1):
dosomething(count, x)
print "I did something {0} times".format(count)

Это необходимо? Нет. Но, это, конечно, удобно.

Еще одна вещь, о которой следует знать: в python 2 также происходит утечка переменных в представлениях о списках:

>>> [x**2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> x
9

Но то же самое не относится к Python 3.

Ответ 4

Одним из основных факторов, повлиявших на Python, является ABC, язык, разработанный в Нидерландах для обучения концепциям программирования начинающих. Создатель Python, Гвидо ван Россум, работал над ABC в течение нескольких лет в 1980-х годах. Я почти ничего не знаю об ABC, но поскольку он предназначен для начинающих, я полагаю, что у него должно быть ограниченное количество областей, как и в ранних основах.

python