执行甚至IF语句的其他语句为TRUE

时间:2013-03-24 10:39:06

标签: python if-statement

我在标题中描述的 Python 语言中遇到了问题。

 for slovo in slova:
        if pygame.mouse.get_pressed()[0] and slovo["rect"].collidepoint(pygame.mouse.get_pos()):
            for i in range (len(randRijec)):
                if slovo["name"] in randRijec[i]:
                    if i == 0:
                        slovo1 = randRijec[i].upper()
                        prvoSlovo = 1
                    ...
                    ...
                else:
                    pogresnoBrojac += 1
            slova.remove(slovo)

所以,即使这个IF语句是 true ,也正在执行ELSE语句!但是,如果 if语句已满足,则应跳过 else语句

如何解决此问题?

P.S。我之前几次遇到过这个问题而且我无法解决它......

4 个答案:

答案 0 :(得分:3)

代码中有多个标签和空格:

运行cat -A test.py(在Unix上)产生

     for slovo in slova:$
            if pygame.mouse.get_pressed()[0] and slovo["rect"].collidepoint(pygame.mouse.get_pos()):$
                for i in range (len(randRijec)):$
                    if slovo["name"] in randRijec[i]:$
                        if i == 0:$
                            slovo1 = randRijec[i].upper()$
                            prvoSlovo = 1$
^I^I^I^I^I^I...$
^I^I^I^I^I^I...$
                    else:$
                        pogresnoBrojac += 1$
                slova.remove(slovo)$

^I表示标签。

因此,else块不会被解释为处于出现的缩进级别。

你的python代码永远不应该混合标签和空格来缩进。您可以通过运行python -t script.py来检查脚本是否混合了标签和空格。

在Python中,您必须承诺仅使用空格或仅使用制表符进行缩进。 PEP8建议仅使用空格缩进。

您可以使用reindent.py program将标签转换为空格。

答案 1 :(得分:2)

  

所以,即使这个IF语句是真的,ELSE语句也在执行!

我可以向你保证,这不会发生。

我注意到在代码的大纲中if位于for循环中。请确保在您的实际代码中else不会意外地与for而不是if对齐。我不止一次见过这个错误。

在Python中,for-else is a valid construct。例如,以下是完全有效的Python:

for i in range(10):
    if i < 100:
        pass
else:
    print 'In else clause'

运行时,会打印出In else clause

将此与以下内容进行对比,后者在运行时不会打印任何内容:

for i in range(10):
    if i < 100:
        pass
    else:
        print 'In else clause'

答案 2 :(得分:0)

这是很久以前的一个问题,我在对同一问题进行故障排除时偶然发现了这个问题-解决方案实际上很愚蠢,很可能也是这样-因为它是一个for循环,它遍历每个列表元素,即使这些元素之一都不满足if条件,它也会自动触发else-很不言而喻,但对于初学者来说很容易错过。 好吧,至少这是我的问题:)

答案 3 :(得分:-1)

下一个解决方案解决了我的问题:

    for slovo in slova:
        if pygame.mouse.get_pressed()[0] and slovo["rect"].collidepoint(pygame.mouse.get_pos()):
            xy = 0
            for i in range (len(randRijec)):
                if slovo["name"] in randRijec[i]:
                    xy = 1
                    if i == 0:
                        slovo1 = randRijec[i].upper()
                        prvoSlovo = 1
                        break
                    if i == 1:
                        slovo2 = randRijec[i].upper()
                        drugoSlovo = 1
                        break
            slova.remove(slovo)
            if xy == 0:
                pogresnoBrojac += 1

    ...
    ...
    ...

    xy = 1
    pygame.display.update()
    time.tick(value)

所以,我刚刚添加了 xy 计数器,这使得我的代码可以正常工作。当 IF 语句满足时, xy 变为 1 ,如果 IF 语句未满足, xy 设置为 0 ,然后执行此“ else ”语句。在代码的末尾, xy 再次设置为 1 ,以防止执行此“else”( if xy == 0 )块。

感谢您的帮助!