Обзоры в Python для циклов - PullRequest
148 голосов
/ 31 августа 2010

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

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

Выше будет напечатано (9,2).

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

Ответы [ 6 ]

92 голосов
/ 31 августа 2010

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

Обновление

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

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

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

53 голосов
/ 31 августа 2010

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

35 голосов
/ 31 августа 2010

Действительно полезный случай для этого - при использовании 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.

2 голосов
/ 07 сентября 2018

Если у вас есть оператор break в цикле (и вы хотите использовать значение итерации позже, возможно, чтобы выполнить резервное копирование, индексировать что-либо или присвоить статус), это сэкономит вам одну строку кода и одно присваивание, так что есть удобство.

1 голос
/ 31 августа 2010

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

0 голосов
/ 01 сентября 2010

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

В текущей ситуации:

# Sum the values 0..9
total = 0
for foo in xrange(10):
    total = total + foo
print total

урожайность 45. Теперь рассмотрим, как работает назначение в Python. Если переменные цикла были строго локальными:

# Sum the values 0..9?
total = 0
for foo in xrange(10):
    # Create a new integer object with value "total + foo" and bind it to a new
    # loop-local variable named "total".
    total = total + foo
print total

дает 0, поскольку total внутри цикла после присваивания не является той же переменной, что и total вне цикла Это не будет оптимальным или ожидаемым поведением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...