นี่คือข้อผิดพลาดในการเขียนโปรแกรม Python ที่พบบ่อยที่สุดหรือ "Gotchas" ที่นักเขียนโปรแกรมมักทำ:
- การค้นหาชื่อในขอบเขต (Scope Name Lookups) - Python ปฏิบัติตามกฎขอบเขตตามลำดับ LEGB (Local, Enclosing, Global, Built-in) เนื่องจาก Python ไม่มีการผูกประเภทข้อมูลอย่างเคร่งครัด นักเขียนโปรแกรมจึงสามารถกำหนดค่าใหม่ให้ตัวแปรในขอบเขตภายนอกได้ ซึ่งอาจทำให้ค่าเดิมที่อาจถูกใช้ในขอบเขตภายนอกภายหลังถูกแทนที่ด้วยค่าใหม่
- ไม่แยกแยะระหว่าง
isและ==- ออเปอเรเตอร์isใน Python ตรวจสอบว่าทั้งสองออบเจ็กต์อ้างอิงถึงที่อยู่หน่วยความจำเดียวกันหรือไม่ ในขณะที่ออเปอเรเตอร์==จะเรียกใช้ฟังก์ชัน__eq__ซึ่งอาจตรวจสอบความเท่ากันต่างกันไปในแต่ละคลาส - การแก้ไขลิสต์ขณะกำลังวนลูปผ่านมัน - หากคุณลบสมาชิกออกจากลิสต์ขณะกำลังวนลูปผ่านมัน คุณจะได้
IndexErrorเนื่องจากขนาดของลิสต์ลดลง ในขณะที่ดัชนีไม่ได้ลดลงตามไปด้วย - การผูกค่าใน Closure (Closure Binding) - พิจารณาโค้ดต่อไปนี้:
listLambdas = [lambda x: i + x for i in range(5)]
for lam in listLambdas:
print(lam(10))
ผลลัพธ์
14 14 14 14 14
ประหลาดใจไหม? สิ่งนี้เกิดจากการผูกค่าใน Enclosures ทุกฟังก์ชัน lambda ในลิสต์นี้ "อ้างอิง" (REFER) ไปที่ตัวแปร i คือ เมื่อค่าของ i เปลี่ยน ฟังก์ชัน lambda ทั้งหมดจะเริ่มอ้างอิงไปที่ค่าใหม่
- ชื่อชนกับฟังก์ชันสร้างภายใน (Name Clash with Built-ins) - คุณต้องเคยสร้างตัวแปรชื่อ
sumไปบ้าง สังเกตว่าในกรณีนี้คุณได้กำหนดการอ้างอิงใหม่ให้กับฟังก์ชันsumแม้จะดู瑣碎สำหรับสิ่งแบบนี้ แต่สามารถก่อให้เกิดปัญหาร้ายแรงได้เมื่อแพ็กเกจถูกตั้งชื่อในลักษณะดังกล่าว ซึ่งอาจทำให้แพ็กเกจอื่นนำคลาสของคุณไปใช้แทนที่จะเป็นมาตรฐาน - การนำออเปอเรเตอร์ไปใช้งานแบบไม่น่าเข้าใจ (Unintuitive Implementations for Operators) - Python มีวิธีการให้สร้างออเปอเรเตอร์โหลดโอเวอร์โหลดสำหรับคลาส บ่อยครั้งที่คนมักนำออเปอเรเตอร์เหล่านี้ไปใช้งานในลักษณะที่ไม่คุ้นเคย และสุดท้ายก็สร้าง API ที่ซับซ้อนและไม่น่าเข้าใจ