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

การเก็บขยะใน Python


การจัดการหน่วยความจำ 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