Python deque.copy: ถ่าย snapshot คิวโดยรักษา maxlen
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 ต้องนิ่งจริง