การจัดการหน่วยความจำ Python ตรงไปตรงมา คุณไม่จำเป็นต้องกังวลเกี่ยวกับการจัดการหน่วยความจำ เนื่องจากการจัดสรรหน่วยความจำและการจัดสรรคืนเป็นไปโดยอัตโนมัติ หนึ่งในกลไกของการจัดการหน่วยความจำคือการรวบรวมขยะ มาทำความเข้าใจแง่มุมต่างๆ ของการเก็บขยะกันเถอะ
การเก็บขยะ
เป็นกระบวนการทำความสะอาดหน่วยความจำคอมพิวเตอร์ที่ใช้ร่วมกันซึ่งกำลังถูกนำไปใช้โดยโปรแกรมที่ทำงานอยู่ เมื่อโปรแกรมนั้นไม่ต้องการหน่วยความจำนั้นอีกต่อไป ด้วยการรวบรวมขยะ หน่วยความจำที่ว่างนั้นสามารถใช้กับโปรแกรมอื่นได้
มีสองวิธีที่ python ใช้สำหรับการจัดการหน่วยความจำ -
- การนับอ้างอิง
- เก็บขยะ
การรวบรวมขยะของ Python เป็นแบบอัตโนมัติ แต่ในภาษาการเขียนโปรแกรมบางภาษา คุณต้องทำความสะอาดวัตถุด้วยตัวเอง ใน python ถ้าคุณต้องการ คุณสามารถลบวัตถุได้ด้วยตนเอง
>>> x = 9 >>> print(x) 9 >>> del x >>> print(x) Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> print(x) NameError: name 'x' is not defined
ด้านบนเราเพียงแค่กำหนดหนึ่งตัวแปร (x) และใช้งาน ระหว่างรันไทม์ เราลบอ็อบเจ็กต์ (เพราะทุกอย่างใน python เป็นอ็อบเจ็กต์) และพยายามส่งออกอ็อบเจ็กต์
ในสองบรรทัดแรกของโปรแกรมข้างต้น วัตถุ x เป็นที่รู้จัก อย่างไรก็ตาม หลังจากที่ลบ object(x) แล้ว เราไม่สามารถพิมพ์มันได้อีกต่อไป
จากด้านบน เราจะเห็นว่าการรวบรวมขยะเป็นแบบอัตโนมัติทั้งหมด และเราไม่ต้องกังวลกับมัน มาทำความเข้าใจแนวคิดข้างต้นด้วยตัวอย่างอื่น ทุกอ็อบเจ็กต์ใน python เหมือนในโค้ดด้านบน วัตถุ x มีการนับการอ้างอิงและตัวชี้ไปยังประเภท
ค่าการเปลี่ยนแปลงจำนวนการอ้างอิงขึ้นอยู่กับวิธีที่เราใช้ ตัวอย่างเช่น ถ้าเรากำหนดวัตถุ x ให้กับวัตถุ y อื่น จำนวนอ้างอิงจะเพิ่มขึ้นเป็น 2
>>> some_list = [1, 2 ,3, 4, 5, 6, 7, 8, 9] >>> #Reference count of some_list = 1 >>> other_list = some_list >>> #Reference count = 2 >>> #This will also increases if we pass the object as an assignment >>> list_total = sum(some_list) >>> # If we put the object in a list, reference count will also increase >>> list_of_list = [some_list, some_list, some_list] >>> >>> #Let's check the reference count of object "some_list" >>> import sys >>> sys.getrefcount(some_list) 6
ด้านบนเป็นตัวอย่างที่ดีอย่างหนึ่งในการทำความเข้าใจการนับอ้างอิงของการจัดการหน่วยความจำในหลาม เราสร้างวัตถุหนึ่งรายการ "some_list" (จำนวนอ้างอิง =1) เรากำหนดให้วัตถุอื่น (จำนวนอ้างอิง =2) เราตั้งค่าวัตถุเป็นอาร์กิวเมนต์ (จำนวนอ้างอิง =3) และต่อมาเราใส่วัตถุลงใน รายการที่เกิดของวัตถุสามครั้ง (จำนวนอ้างอิง =6) ต่อมาเมื่อเราพยายามหาจำนวนอ้างอิงของวัตถุ “some_list” เราจะได้ 6
>>> import sys >>> sys.getrefcount(some_list) 6 >>> >>> del list_of_list >>> sys.getrefcount(some_list) 3 >>> del some_list >>> sys.getrefcount(some_list) Traceback (most recent call last): File "<pyshell#17>", line 1, in <module> sys.getrefcount(some_list) NameError: name 'some_list' is not defined