Подтвердить что ты не робот

Предоставляет ли python официальную поддержку повторного использования переменной цикла после цикла?

Является ли следующая неправильная практика кода?

for i in some_values:
    do_whatever(i)
do_more_things(i)

Как-то мне кажется, что переменная i должна оставаться в области видимости блока внутри цикла for. Однако python 2.7 позволяет повторно использовать его после цикла.

Поддерживает ли python эту функцию или я злоупотребляю языком?

4b9b3361

Ответ 1

Да, он официально:

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

> The target list is not deleted when the loop is finished 

http://docs.python.org/reference/compound_stmts.html#for

Обратите внимание, что список после for намного больше, чем просто переменная:

for some_list[blah] in...
for some_object.foo in...
for a[:n] in ...:

и т.д.. Эти вещи не могут просто исчезнуть после цикла.

Ответ 2

Python может чувствовать себя немного особенным, когда дело доходит до определения области видимости, если вы исходите из таких языков, как C или Java. Как сказано в предыдущем ответе, код абсолютно верен, но я бы порекомендовал его. Он создает не особо читаемый код и, кроме того, если some_values оказывается пустым, в последней строке кода будет возникать исключение.

Так что ответ на ваш вопрос - да, он официально поддерживается, но в большинстве случаев стратегия не рекомендуется.

Интересное обсуждение можно найти здесь, а также локальное обсуждение fooobar.com/questions/56720/....

Ответ 3

Вы можете использовать этот метод для сканирования списка элементов, соответствующих некоторым критериям:

for item in iter:
    if interesting(item):
        break
else:
    raise ValueError('iter is boring.')

handle(item)

Ответ 4

Как и @petr, это звучит неестественно. Не потому, что это допускало это естественным, или вы должны использовать его.

У меня есть что-то вроде этого, хотя оно может и не относиться к логике с использованием прецедента break:

for i in some_values:
    do_whatever(i)
else:
    do_more_things(i)

Но это все равно поднимает NameError, если some_values оценивается как пустое, но звучит яснее. Это не дает четкой читаемости внутренней области, но это может указывать на отступы.

Но, как сказал другой, чтобы ответить на конкретный вопрос ОП, да, он легален.

Ответ 5

Это не особенность. Как вы писали, переменная остается в области. Это нормальное поведение интерпретатора.