Pernyataan lain yang mengeksekusi pernyataan IF pun BENAR

Saya memiliki masalah dalam bahasa Python yang dijelaskan dalam judul.

 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)

Jadi, meskipun pernyataan IF ini benar, pernyataan ELSE sedang dieksekusi! Namun, pernyataan lain harus dilewati jika pernyataan jika terpenuhi.

Bagaimana cara memperbaiki masalah ini?

hal. Saya pernah mengalami masalah ini beberapa kali sebelumnya dan saya tidak dapat menyelesaikannya...


person lbartolic    schedule 24.03.2013    source sumber
comment
Harap sertakan SSCCE (sscce.org) yang menunjukkan masalah tersebut.   -  person NPE    schedule 24.03.2013
comment
Apakah maksud Anda kedua blok dieksekusi atau hanya blok lain saja? Apakah Anda yakin lekukannya benar?   -  person wRAR    schedule 24.03.2013
comment
periksa lekukan Anda.   -  person Thanakron Tandavas    schedule 24.03.2013
comment
lekukannya benar, ya, kedua blok sedang dieksekusi   -  person lbartolic    schedule 24.03.2013
comment
dan mengapa (-1) jika pertanyaannya ditanyakan dengan benar? terima kasih btw   -  person lbartolic    schedule 24.03.2013
comment
Mudah untuk menghilangkan prasangka dengan menambahkan time.sleep dan pernyataan print count up untuk melihat nomor mana dalam for-loop yang dipicu oleh else Anda (alias debugging kasar). jawaban Anda jauh dari Pythonic.   -  person ZF007    schedule 12.08.2019


Jawaban (4)


Anda memiliki campuran tab dan spasi dalam kode Anda:

Menjalankan cat -A test.py (di Unix) menghasilkan

     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 menunjukkan tab.

Dengan demikian, blok else tidak ditafsirkan berada pada level lekukan tampaknya.

Kode python Anda tidak boleh mencampur tab dan spasi untuk lekukan. Anda dapat memeriksa apakah skrip Anda tidak mencampurkan tab dan spasi dengan menjalankan python -t script.py.

Dengan Python Anda harus berkomitmen untuk menggunakan spasi saja atau tab saja untuk lekukan. PEP8 merekomendasikan indentasi khusus spasi.

Anda dapat mengonversi tab menjadi spasi menggunakan program reindent.py.

person unutbu    schedule 24.03.2013
comment
Tidak ada keraguan bahwa ini adalah nasihat yang sangat bagus. Namun, bukankah dalam contoh ini if dan else menjorok menggunakan spasi saja? Saya yakin saya melewatkan sesuatu yang jelas di sini. - person NPE; 24.03.2013
comment
terima kasih untuk yang ini, tapi saya tidak bisa memperbaiki masalah ini. ketika saya membuat indentasinya dengan cara yang benar, saya terus mendapatkan masalah ini. - person lbartolic; 24.03.2013
comment
@NPE: Anda benar; ini mungkin bukan masalah sebenarnya. Namun, menurut pengalaman saya, ketika aturan dasar dipatuhi, kesalahan misterius cenderung hilang. - person unutbu; 24.03.2013
comment
@ lucro93: Dalam hal ini, Anda benar-benar perlu menunjukkan kepada kami kode runnable yang menunjukkan masalahnya. - person unutbu; 24.03.2013
comment
saya menemukan solusi! saya akan menjawab - person lbartolic; 24.03.2013


Ini adalah pertanyaan dari waktu yang lama dan saya menemukannya ketika saya sedang memecahkan masalah yang sama - solusinya sebenarnya cukup konyol dan kemungkinan besar juga demikian - karena ini adalah perulangan for yang diulangi melalui setiap elemen daftar, jika genap salah satu elemen tersebut tidak memenuhi kondisi if, secara otomatis akan memicu elemen lain - cukup jelas namun mudah dilewatkan oleh pemula. Setidaknya itulah masalah dalam kasus saya :)

person Jan Piątkowski    schedule 11.08.2019

Solusi selanjutnya memperbaiki masalah saya:

    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)

Jadi, saya baru saja menambahkan penghitung xy yang membuat kode saya berfungsi sebagaimana mestinya. Jika pernyataan IF terpenuhi, xy menjadi 1, jika pernyataan IF tidak terpenuhi, xy disetel ke 0 dan kemudian pernyataan "else" ini dijalankan. Di akhir kode, xy disetel ke 1 lagi untuk mencegah eksekusi blok "else" (if xy == 0) ini.

person lbartolic    schedule 24.03.2013