Python For -Else 范围

Python scopes in For -Else

我正在学习 python,无法理解下面代码片段中的标志是怎么回事。由于我在 if 套件中将标志更新为 false,我希望看到从 else 打印的 false,但输出显示为 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

您在每次迭代开始时设置 flag = True,因此它打印 true,在最后一次迭代中它被分配给 true,其中 obj 等于 5

您可能想通过从 for 循环中移出 flag = True 来更正它:

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

如果 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)

这是循环结构的微小变体,我知道它的名字是 witness,因为您只对 单个 "witness" 感兴趣作证3是对象列表。一旦你找到了这个证人(也就是元素3)。

But If I break from the loop, I will not enter the else.

虽然这是事实,但实际上没有理由拥有 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)