คำสั่งอื่นที่ดำเนินการแม้คำสั่ง IF จะเป็น TRUE

ฉันมีปัญหาในภาษา 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 ก็กำลังถูกดำเนินการ! อย่างไรก็ตาม ควรข้าม คำสั่งอื่น หากปฏิบัติตามคำสั่ง หาก

จะแก้ไขปัญหานี้ได้อย่างไร?

ปล. ฉันเคยประสบปัญหานี้มาสองสามครั้งแล้วและไม่สามารถแก้ไขได้...


person lbartolic    schedule 24.03.2013    source แหล่งที่มา
comment
โปรดรวม SSCCE (sscce.org) ที่แสดงให้เห็นถึงปัญหา   -  person NPE    schedule 24.03.2013
comment
คุณหมายถึงว่าทั้งสองบล็อกถูกดำเนินการหรือเฉพาะบล็อกอื่นเท่านั้น? คุณแน่ใจหรือว่าการเยื้องถูกต้อง?   -  person wRAR    schedule 24.03.2013
comment
ตรวจสอบการเยื้องของคุณ   -  person Thanakron Tandavas    schedule 24.03.2013
comment
การเยื้องถูกต้อง ใช่ ทั้งสองบล็อกกำลังดำเนินการอยู่   -  person lbartolic    schedule 24.03.2013
comment
และทำไม (-1) ถ้าคำถามถูกถามอย่างถูกต้อง? ขอบคุณนะ   -  person lbartolic    schedule 24.03.2013
comment
หักล้างได้อย่างง่ายดายโดยการเพิ่ม time.sleep และคำสั่งการพิมพ์นับถอยหลังเพื่อดูว่าหมายเลขใดใน for-loop ที่คุณทริกเกอร์ (หรือที่เรียกว่าการแก้ไขจุดบกพร่องแบบคร่าวๆ) คำตอบของคุณอยู่ไกลจาก pythonic   -  person ZF007    schedule 12.08.2019


คำตอบ (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 -t script.py

ใน Python คุณต้องยอมรับที่จะใช้เพียงช่องว่างหรือแท็บเท่านั้นสำหรับการเยื้อง PEP8 แนะนำให้เว้นวรรคเท่านั้น

คุณสามารถแปลงแท็บเป็นช่องว่างได้โดยใช้โปรแกรม reindent.py.

person unutbu    schedule 24.03.2013
comment
ไม่ต้องสงสัยเลยว่านี่เป็นคำแนะนำที่ดีมาก อย่างไรก็ตาม ในตัวอย่างนี้ if และ else เยื้องโดยใช้ช่องว่างเพียงอย่างเดียวไม่ใช่หรือ ฉันแน่ใจว่าฉันพลาดบางสิ่งบางอย่างที่ชัดเจนที่นี่ - person NPE; 24.03.2013
comment
ขอบคุณสำหรับสิ่งนี้ แต่ฉันไม่สามารถแก้ไขปัญหานี้ได้ เมื่อฉันเยื้องมันอย่างถูกต้อง ฉันมักจะได้รับปัญหานี้ - person lbartolic; 24.03.2013
comment
@NPE: คุณพูดถูก; นี่อาจไม่ใช่ปัญหาที่แท้จริง อย่างไรก็ตาม จากประสบการณ์ของผม เมื่อปฏิบัติตามกฎพื้นฐานแล้ว ข้อผิดพลาดลึกลับมักจะหายไป - person unutbu; 24.03.2013
comment
@ lucro93: ในกรณีนั้น คุณต้องแสดงโค้ดที่รันได้ซึ่งแสดงปัญหาให้เราทราบ - person unutbu; 24.03.2013
comment
ฉันพบวิธีแก้ปัญหาแล้ว! ฉันจะตอบ - person lbartolic; 24.03.2013

ดังนั้นแม้คำสั่ง 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'
person NPE    schedule 24.03.2013
comment
ขอบคุณสำหรับคำตอบ แต่คำสั่ง else ของฉันเรียงรายไปด้วยคำสั่ง if หากคุณต้องการบอกว่าคำสั่ง else นั้นเรียงรายไปด้วยคำสั่ง for one - person lbartolic; 24.03.2013
comment
else จะถูกดำเนินการใน for-loop อื่น ดูความคิดเห็นหลักของฉันที่คำถาม - person ZF007; 12.08.2019

มันเป็นคำถามเมื่อนานมาแล้วและฉันก็สะดุดกับมันในขณะที่ฉันกำลังแก้ไขปัญหาเดียวกัน - วิธีแก้ปัญหานั้นค่อนข้างงี่เง่าและส่วนใหญ่ก็เป็นเช่นนั้น - เนื่องจากเป็น for loop มันจะวนซ้ำทุกองค์ประกอบรายการหาก องค์ประกอบใดองค์ประกอบหนึ่งไม่ตรงตามเงื่อนไข if โดยจะทริกเกอร์องค์ประกอบอื่นโดยอัตโนมัติ ซึ่งค่อนข้างชัดเจนในตัวเอง แต่พลาดได้ง่ายสำหรับผู้เริ่มต้น อย่างน้อยนั่นก็เป็นปัญหาในกรณีของฉัน :)

person Jan Piątkowski    schedule 11.08.2019

วิธีแก้ไขปัญหาถัดไปแก้ไขปัญหาของฉัน:

    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) นี้

person lbartolic    schedule 24.03.2013