การจัดการค่าพารามิเตอร์เริ่มต้นของ Python เป็นหนึ่งในบางสิ่งที่อาจรบกวนโปรแกรมเมอร์ Python ใหม่ส่วนใหญ่ได้
สาเหตุของปัญหาคือการใช้ออบเจกต์ "ไม่แน่นอน" เป็นค่าเริ่มต้น นั่นคือค่าที่สามารถแก้ไขได้ เช่น รายการหรือพจนานุกรม
รายการใหม่จะถูกสร้างขึ้นทุกครั้งที่มีการเรียกใช้ฟังก์ชันหากไม่มีอาร์กิวเมนต์ที่สอง เพื่อให้ผลลัพธ์ที่คาดหวังคือ:
[12] [43]
รายการใหม่จะถูกสร้างขึ้นครั้งเดียวเมื่อมีการกำหนดฟังก์ชัน และใช้รายการเดียวกันในการเรียกแต่ละครั้ง
อาร์กิวเมนต์เริ่มต้นของ Python จะได้รับการประเมินครั้งเดียวเมื่อมีการกำหนดฟังก์ชัน ไม่ใช่ทุกครั้งที่เรียกใช้ฟังก์ชัน ซึ่งหมายความว่าหากคุณใช้อาร์กิวเมนต์เริ่มต้นที่เปลี่ยนแปลงได้และเปลี่ยนอาร์กิวเมนต์ คุณจะและได้เปลี่ยนออบเจกต์นั้นสำหรับการเรียกใช้ฟังก์ชันในอนาคตทั้งหมดด้วย
เราควรทำอย่างไร
สร้างออบเจ็กต์ใหม่ทุกครั้งที่มีการเรียกใช้ฟังก์ชัน โดยใช้ arg เริ่มต้นเพื่อส่งสัญญาณว่าไม่มีการระบุอาร์กิวเมนต์ (มักไม่มีตัวเลือกที่ดีเลย)
ตัวอย่าง
def func(data=[]): data.append(1) return data func() func() def append2(element, foo=None): if foo is None: foo = [] foo.append(element) return foo print(append2(12)) print(append2(43))
ผลลัพธ์
[12] [43]