Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ข้อผิดพลาดทั่วไปหรือ "Gotchas" ใน Python ที่นักเขียนโปรแกรมมักเจอ

นี่คือข้อผิดพลาดในการเขียนโปรแกรม Python ที่พบบ่อยที่สุดหรือ "Gotchas" ที่นักเขียนโปรแกรมมักทำ:

การค้นหาชื่อในขอบเขต (Scope Name Lookups)

Python ปฏิบัติตามกฎขอบเขต (scoping rules) ตามลำดับ LEGB (Local, Enclosing, Global, Built-in) เนื่องจาก Python ไม่มีการผูกประเภทข้อมูลอย่างเคร่งครัด (no strict type binding) นักเขียนโปรแกรมจึงสามารถกำหนดค่าใหม่ให้ตัวแปรในขอบเขตภายนอกได้ ซึ่งอาจทำให้ค่าเดิมที่อาจถูกใช้ในขอบเขตภายนอกภายหลังถูกแทนที่ด้วยค่าใหม่

ไม่แยกแยะระหว่าง is และ ==

ออเปอเรเตอร์ is ใน Python ตรวจสอบว่าทั้งสองออบเจ็กต์อ้างอิงถึงที่อยู่หน่วยความจำเดียวกันหรือไม่ ในขณะที่ออเปอเรเตอร์ == จะเรียกใช้ฟังก์ชัน __eq__ ซึ่งอาจตรวจสอบความเท่ากันต่างกันไปในแต่ละคลาส

การแก้ไขลิสต์ขณะกำลังวนลูปผ่านมัน

หากคุณลบสมาชิกออกจากลิสต์ขณะกำลังวนลูปผ่านมัน คุณจะได้ IndexError เนื่องจากขนาดของลิสต์ลดลง ในขณะที่ดัชนี (index) ไม่ได้ลดลงตามไปด้วย

การผูกค่าใน 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

ประหลาดใจไหม? สิ่งนี้เกิดจากการผูกค่าใน Closure ทุกฟังก์ชัน lambda ในลิสต์นี้ "อ้างอิง" (REFER) ไปที่ตัวแปร i เดียวกัน คือ เมื่อค่าของ i เปลี่ยน ฟังก์ชัน lambda ทั้งหมดจะเริ่มอ้างอิงไปที่ค่าใหม่

ชื่อชนกับฟังก์ชันสร้างภายใน (Name Clash with Built-ins)

คุณต้องเคยสร้างตัวแปรชื่อ sum ไปบ้าง สังเกตว่าในกรณีนี้คุณได้กำหนดการอ้างอิงใหม่ให้กับฟังก์ชัน sum แม้จะดู瑣碎สำหรับสิ่งแบบนี้ แต่สามารถก่อให้เกิดปัญหาร้ายแรงได้เมื่อแพ็กเกจถูกตั้งชื่อในลักษณะดังกล่าว ซึ่งอาจทำให้แพ็กเกจอื่นนำคลาสของคุณไปใช้แทนที่จะเป็นมาตรฐาน

การนำออเปอเรเตอร์ไปใช้งานแบบไม่น่าเข้าใจ (Unintuitive Implementations for Operators)

Python มีวิธีการให้สร้างออเปอเรเตอร์โหลดโอเวอร์โหลด (overload operator functions) สำหรับคลาส บ่อยครั้งที่คนมักนำออเปอเรเตอร์เหล่านี้ไปใช้งานในลักษณะที่ไม่คุ้นเคย และสุดท้ายก็สร้าง API ที่ซับซ้อนและไม่น่าเข้าใจ