งูขดต้นฉบับกำลังถ่ายของจากสายพานคิวลงถาด snapshot ที่มีขอบจำกัดบนโต๊ะสว่าง

Python deque.copy: ถ่าย snapshot คิวโดยรักษา maxlen

พี่โชว์Engineering

deque.copy() สร้างคิวใหม่ที่มีลำดับและ maxlen เดิม เหมาะกับการถ่าย snapshot ก่อนส่งให้ observer หรือ test ครับ แต่เป็น shallow copy: container แยกกัน ส่วน object ข้างในยังเป็นตัวเดียวกัน

from collections import deque
import unittest


class DequeCopyTests(unittest.TestCase):
    def test_container_is_independent_and_maxlen_survives(self):
        original = deque([{"id": 1}, {"id": 2}], maxlen=2)
        snapshot = original.copy()

        original.append({"id": 3})
        self.assertEqual([item["id"] for item in snapshot], [1, 2])
        self.assertEqual(snapshot.maxlen, 2)

        snapshot[0]["id"] = 99
        self.assertEqual(snapshot[0]["id"], 99)
        self.assertEqual(original[0]["id"], 2)


if __name__ == "__main__":
    unittest.main()

Snapshot ไม่ใช่ deep freeze

ถ้าคิวเก็บ dict/list ที่ยังถูกแก้จาก thread หรือ task อื่น การ copy container ไม่หยุด mutation ภายใน ให้แปลง element เป็น immutable record หรือ copy.deepcopy เมื่อ contract ต้องการสำเนาลึก—และวัดต้นทุนก่อน เพราะคิวใหญ่จะ copy แบบ O(n)

เหมือนถ่ายรูปชั้นวาง เราได้ลำดับของกล่อง ณ ตอนนั้น แต่ถ้าคนเปิดกล่องใบเดิมเปลี่ยนของข้างใน รูปจำลองที่ยังชี้กล่องเดียวกันก็เห็นการเปลี่ยนตาม

Recap

  • ใช้ copy() เมื่อต้องแยก mutation ของ deque
  • จำว่า element ยัง shared แบบ shallow copy
  • maxlen ถูกเก็บไว้ในสำเนา
  • ใช้ immutable element เมื่อ snapshot ต้องนิ่งจริง