1

我有一个标题中描述的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 语句为,ELSE 语句也在执行!但是,如果满足if 语句,则应跳过else 语句

如何解决这个问题?

ps 这个问题我也遇到过好几次了,一直没解决。。。

4

4 回答 4

4

您的代码中混合了制表符和空格:

运行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 程序将制表符转换为空格。

于 2013-03-24T10:49:30.273 回答
3

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

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

我注意到在您的代码大纲中,if它位于for循环内。确保在您的实际代码中,else不会意外地与for而不是if. 我不止一次看到这个错误。

在 Python 中,for-else是一个有效的构造。例如,以下是完全有效的 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'
于 2013-03-24T10:42:45.403 回答
0

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

于 2019-08-11T22:31:23.500 回答
-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”(如果 xy == 0)块。

于 2013-03-24T11:29:17.960 回答