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)
我正在学习 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)