Python在For-Else中的作用域

Python在For-Else中的作用域,python,scopes,for-else,Python,Scopes,For Else,我正在学习python,无法理解下面代码段中flag的情况。因为我已经在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 o

我正在学习python,无法理解下面代码段中flag的情况。因为我已经在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
如果不选择断开,则这是固定代码:

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

但是如果我打破循环,我就不会进入else

虽然这是事实,但没有理由实际使用for..else构造。因为您正在搜索列表中的元素,所以尽早从循环中中断是有意义的。因此,无论循环如何结束,都应该完全删除else并运行该打印

此外,由于您正在尝试设置您的标志,无论您是否已找到元素,因此不应在每次迭代中重置它:

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)
最后,由于您在查找元素时设置了find_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)

你需要从循环中断后找到数字,而且你有一个坏的缩进,否则必须在同一个缩进if@Kasra,我知道你的意思,循环运行整个列表,即使它不是必需的。但是如果我打破循环,我就不会进入else。我真的很想了解如何访问else套件中的变量或对象。@Kasra:如果这是有意的,缩进是可以的。else块属于for循环。如果循环遍历了所有项而没有中断,则会运行它。@JeffMercado yes,在这种情况下是真的。@user2928913我不明白你在else套件中访问变量或对象的意思,你能解释更多吗?因为OP的代码中没有中断,这并没有什么错。你的第一句话让代码看起来好像是因为else而失败的,但由于OP没有从循环中中断,所以使用else没有什么错。OP很清楚这一限制。