Области применения Python в For -Else

Я изучаю Python и не могу понять, что происходит с флагом в приведенном ниже фрагменте кода. Поскольку я обновил флаг до false с помощью набора if, я ожидаю увидеть false, напечатанный из else, но вывод показывает true. Может кто-нибудь, пожалуйста, помогите мне понять, что здесь происходит.

objects=[1,2,3,4,5]
found_obj = None
for obj in objects:
    flag = True
    if obj == 3:
        found_obj = obj
        print("found the required object ",found_obj)
        flag= False

else:
    print ('Status flag ::', flag)

Ниже приведен вывод, который я получаю при выполнении этого кода

found the required object  3
Status flag :: True

3 ответа

Решение

Ты устанавливаешь flag = True в начале каждой итерации, таким образом, она печатает true где это назначено true в последней итерации, где obj равно 5

Вы можете исправить это, переместившись flag = True из цикла for:

flag = True
for obj in objects:
    if obj == 3:
        found_obj = obj
        print("found the required object ",found_obj)
        flag= False
        break  # no need to continue search

Но если я вырвусь из цикла, я не войду в остальное.

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

Кроме того, поскольку вы пытаетесь установить свой флаг независимо от того, нашли ли вы элемент или нет, вам не следует сбрасывать его на каждой итерации:

found_obj = None
flag = True
for obj in objects:
    if obj == 3:
        found_obj = obj
        print("found the required object ",found_obj)
        flag = False
        break

print ('Status flag ::', flag)

Наконец, так как вы устанавливаете found_obj когда вы нашли элемент, вам вообще не нужен этот флаг, так как значение None скажет вам, что вы ничего не нашли, и любое другое значение скажет вам, что вы нашли это:

found_obj = None
for obj in objects:
    if obj == 3:
        found_obj = obj
        print("found the required object ",found_obj)
        break

print ('Status flag ::', found_obj is None)

Если break-ing не вариант, это фиксированный код:

objects=[1,2,3,4,5]
found_obj = None
flag = True # flag is set once, before the loop
for obj in objects:
    # this sets the flag to True *on each iteration*, we only want it once!
    # flag = True 
    if obj == 3:
        found_obj = obj
        print("found the required object ",found_obj)
        flag= False
else:
    print ('Status flag ::', flag)

Это небольшая вариация структуры петли, которую я знаю по имени свидетель, поскольку вас интересует только один "свидетель" для дачи показаний. 3 находится в списке объектов. Как только вы нашли этого свидетеля (который является элементом 3).

Другие вопросы по тегам