{"id":4480,"date":"2026-01-24T20:59:47","date_gmt":"2026-01-24T15:29:47","guid":{"rendered":"https:\/\/www.itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/"},"modified":"2026-02-17T15:56:58","modified_gmt":"2026-02-17T10:26:58","slug":"master-the-python-list-a-complete-guide-with-examples","status":"publish","type":"post","link":"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/","title":{"rendered":"Master the Python List: A Complete Guide with Examples"},"content":{"rendered":"<p>INCIDENT REPORT #882-B: Why our heap looks like a disaster zone.<\/p>\n<p><strong>DATE:<\/strong> October 14, 2023<br \/>\n<strong>TO:<\/strong> Engineering Lead, CTO, and anyone else who thinks &#8220;it&#8217;s just a script&#8221;<br \/>\n<strong>FROM:<\/strong> Senior Systems Engineer (Level 4, Infrastructure)<br \/>\n<strong>SUBJECT:<\/strong> Post-Mortem of the Node-04 Memory Exhaustion Event (Python 3.11.4)<\/p>\n<hr \/>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_80 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-69d85030c930f\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-69d85030c930f\"  aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#SYSTEM_INCIDENT_LOG_2023-10-12T03_14_22Z\" >SYSTEM INCIDENT LOG: 2023-10-12T03:14:22Z<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#SECTION_1_THE_LIE_OF_THE_ABSTRACTION\" >SECTION 1: THE LIE OF THE ABSTRACTION<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#SECTION_2_THE_OVER-ALLOCATION_TAX\" >SECTION 2: THE OVER-ALLOCATION TAX<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#SECTION_3_THE_POINTER_INDIRECTION_NIGHTMARE\" >SECTION 3: THE POINTER INDIRECTION NIGHTMARE<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#SECTION_4_THE_ON_INSERTION_SUICIDE\" >SECTION 4: THE O(N) INSERTION SUICIDE<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#SECTION_5_THE_64-BIT_TAX_AND_OBJECT_OVERHEAD\" >SECTION 5: THE 64-BIT TAX AND OBJECT OVERHEAD<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#SECTION_6_REMEDIATION_FOR_THE_INCOMPETENT\" >SECTION 6: REMEDIATION FOR THE INCOMPETENT<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#1_Use_collectionsdeque_for_Queues\" >1. Use collections.deque for Queues<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#2_Use_arrayarray_for_Homogeneous_Data\" >2. Use array.array for Homogeneous Data<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#3_Use_NumPy_for_Numerical_Work\" >3. Use NumPy for Numerical Work<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#4_Pre-allocate_if_you_must_use_a_list\" >4. Pre-allocate if you must use a list<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#SECTION_7_THE_%E2%80%9CJUNIOR-LEVEL%E2%80%9D_CODE_VS_REALITY\" >SECTION 7: THE &#8220;JUNIOR-LEVEL&#8221; CODE VS. REALITY<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#SECTION_8_FINAL_GRIEVANCES\" >SECTION 8: FINAL GRIEVANCES<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#APPENDIX_A_MEMORY_BREAKDOWN_64-BIT\" >APPENDIX A: MEMORY BREAKDOWN (64-BIT)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#APPENDIX_B_THE_GROWTH_CONSTANTS\" >APPENDIX B: THE GROWTH CONSTANTS<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#Related_Articles\" >Related Articles<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"SYSTEM_INCIDENT_LOG_2023-10-12T03_14_22Z\"><\/span>SYSTEM INCIDENT LOG: 2023-10-12T03:14:22Z<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<pre class=\"codehilite\"><code class=\"language-text\">03:14:22 - CRITICAL - kernel: [99283.12] oom-kill: gfp_mask=0x100cca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0\n03:14:22 - CRITICAL - kernel: [99283.12] Out of memory: Killed process 14202 (python3) total-vm:32.4GB, anon-rss:31.1GB\n03:14:23 - ALERT - Monitoring: Service 'DataIngestor' down on Node-04.\n03:14:45 - INFO - SysEng: Initial investigation shows heap fragmentation and 98% RAM utilization.\n03:15:10 - INFO - SysEng: Tracing memory leak to a single variable: 'pending_records'.\n03:15:12 - INFO - SysEng: It's a python list. Again.\n<\/code><\/pre>\n<hr \/>\n<h3><span class=\"ez-toc-section\" id=\"SECTION_1_THE_LIE_OF_THE_ABSTRACTION\"><\/span>SECTION 1: THE LIE OF THE ABSTRACTION<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>I\u2019ve been awake for 48 hours. My coffee is cold, my eyes feel like they\u2019ve been rubbed with sandpaper, and I\u2019ve spent the last six hours staring at a heap dump that looks like a Jackson Pollock painting if he only used &#8220;unallocated&#8221; and &#8220;pointer&#8221; as colors. The culprit? A <strong>python list<\/strong>. <\/p>\n<p>The problem with modern developers\u2014the ones who think a &#8220;bootcamp&#8221; qualifies them to touch production\u2014is that they treat the <strong>python list<\/strong> as some sort of magical, infinite, weightless container. They think it\u2019s a linked list. They think it\u2019s a &#8220;collection.&#8221; They don&#8217;t realize that under the hood, it\u2019s a brutal, unforgiving C array of pointers that will happily eat your RAM and ask for seconds.<\/p>\n<p>When you call <code>my_list = []<\/code>, you aren&#8217;t just creating a &#8220;box.&#8221; You are invoking <code>PyList_New<\/code> in <code>Objects\/listobject.c<\/code>. You are asking the CPython runtime to manage a <code>PyListObject<\/code> struct. This struct contains a pointer to a block of memory (<code>ob_item<\/code>) and a count of how many items are currently in it (<code>ob_size<\/code>), plus the total capacity (<code>allocated<\/code>). <\/p>\n<p>On a 64-bit system running Python 3.11.4, an empty <strong>python list<\/strong> isn&#8217;t &#8220;empty.&#8221; It\u2019s 56 bytes of overhead just to exist. <\/p>\n<pre class=\"codehilite\"><code class=\"language-bash\">$ python3.11\n&gt;&gt;&gt; import sys\n&gt;&gt;&gt; l = []\n&gt;&gt;&gt; sys.getsizeof(l)\n56\n<\/code><\/pre>\n<p>Fifty-six bytes for <em>nothing<\/em>. And that\u2019s just the start of the tragedy.<\/p>\n<hr \/>\n<h3><span class=\"ez-toc-section\" id=\"SECTION_2_THE_OVER-ALLOCATION_TAX\"><\/span>SECTION 2: THE OVER-ALLOCATION TAX<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Let\u2019s talk about how a <strong>python list<\/strong> grows. It doesn&#8217;t grow one element at a time. That would be too efficient for the OS but too slow for the CPU. Instead, Python uses a &#8220;growth pattern&#8221; to minimize the number of times it has to call <code>realloc()<\/code>. <\/p>\n<p>If you look at <code>listobject.c<\/code> in the CPython source, specifically the <code>list_resize<\/code> function, you\u2019ll see the logic. The growth factor isn&#8217;t a simple doubling. It\u2019s a bit more &#8220;creative.&#8221; The formula for the new size is roughly:<\/p>\n<p><code>new_allocated = (size_t)newsize + (newsize &gt;&gt; 3) + (newsize &lt; 9 ? 3 : 6);<\/code><\/p>\n<p>This means the <strong>python list<\/strong> over-allocates. It grabs more memory than it needs &#8220;just in case.&#8221; Here is the sequence of allocated slots as you append: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88&#8230;<\/p>\n<p>When our &#8220;DataIngestor&#8221; service was pulling 10 million records into a <strong>python list<\/strong>, it wasn&#8217;t just using memory for 10 million records. It was using memory for the next jump in the allocation sequence. If you have 8,000,001 items, the <strong>python list<\/strong> has allocated space for significantly more. That &#8220;slack&#8221; space is dead RAM. It\u2019s a ghost in the machine, sitting there, doing nothing, while the OOM killer sharpens its axe.<\/p>\n<pre class=\"codehilite\"><code class=\"language-bash\"># Monitoring the growth of a python list\n&gt;&gt;&gt; import sys\n&gt;&gt;&gt; l = []\n&gt;&gt;&gt; for i in range(20):\n...     l.append(i)\n...     print(f&quot;Len: {len(l)}, Size: {sys.getsizeof(l)}, Allocated: {(sys.getsizeof(l)-56)\/\/8}&quot;)\n...\nLen: 1, Size: 88, Allocated: 4\nLen: 2, Size: 88, Allocated: 4\nLen: 3, Size: 88, Allocated: 4\nLen: 4, Size: 88, Allocated: 4\nLen: 5, Size: 120, Allocated: 8\n...\nLen: 9, Size: 184, Allocated: 16\n<\/code><\/pre>\n<p>Look at that. At length 5, the <strong>python list<\/strong> jumped from 88 bytes to 120 bytes. It\u2019s already wasting space for 3 extra pointers. On a 64-bit machine, each pointer is 8 bytes. Multiply that by 10 million records, and you\u2019re talking about megabytes of wasted space just to hold <em>nothing<\/em>.<\/p>\n<hr \/>\n<h3><span class=\"ez-toc-section\" id=\"SECTION_3_THE_POINTER_INDIRECTION_NIGHTMARE\"><\/span>SECTION 3: THE POINTER INDIRECTION NIGHTMARE<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Here is the part where the junior devs usually start crying. A <strong>python list<\/strong> does not store your data. It stores <em>pointers<\/em> to your data. <\/p>\n<p>If you have a <strong>python list<\/strong> of integers, you don&#8217;t have a contiguous block of integers in memory. You have a contiguous block of 8-byte memory addresses. Each of those addresses points to a <code>PyObject<\/code> somewhere else on the heap. <\/p>\n<p>Let&#8217;s do the math for 1,000,000 integers.<br \/>\nIn a sane language like C, an array of 1,000,000 32-bit integers takes 4,000,000 bytes. 4MB. Simple.<\/p>\n<p>In Python, for a <strong>python list<\/strong> of 1,000,000 integers:<br \/>\n1. The list itself: ~8,000,000 bytes for the pointers (8 bytes each).<br \/>\n2. The integer objects: Each <code>int<\/code> in Python 3.11 is at least 28 bytes.<br \/>\n   &#8211; 24 bytes for the <code>PyObject<\/code> header (refcount, type pointer, size).<br \/>\n   &#8211; 4 bytes for the actual value.<\/p>\n<p>Total: (8 bytes * 1,000,000) + (28 bytes * 1,000,000) = 36,000,000 bytes.<br \/>\n36MB. <\/p>\n<p>We are using 36MB to store 4MB of data. That is a 9x overhead. And that\u2019s assuming no fragmentation. When the &#8220;DataIngestor&#8221; was running, it wasn&#8217;t just storing integers; it was storing complex dictionaries and strings. The indirection kills cache locality. The CPU spends all its time waiting for the RAM to fetch the pointer, then waiting again to fetch the object the pointer points to. It\u2019s a game of &#8220;where\u2019s Waldo&#8221; played at 3 gigahertz, and the RAM is losing.<\/p>\n<hr \/>\n<h3><span class=\"ez-toc-section\" id=\"SECTION_4_THE_ON_INSERTION_SUICIDE\"><\/span>SECTION 4: THE O(N) INSERTION SUICIDE<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>I found a line of code in the <code>ingestor.py<\/code> file that made me want to throw my mechanical keyboard through the window. <\/p>\n<p><code>pending_records.insert(0, new_record)<\/code><\/p>\n<p>The developer who wrote this clearly thinks a <strong>python list<\/strong> is a linked list. It is not. As I\u2019ve already established, it\u2019s a dynamic array. When you insert at index 0, the <strong>python list<\/strong> has to move <em>every single other pointer<\/em> one slot to the right in memory. <\/p>\n<p>If the list has 1,000,000 items, <code>insert(0, x)<\/code> calls <code>memmove()<\/code> for 8,000,000 bytes. Every. Single. Time.<br \/>\nIf you do this in a loop to ingest 1,000,000 items, you aren&#8217;t doing $O(n)$ work. You are doing $O(n^2)$ work. You are moving trillions of bytes. <\/p>\n<p>I watched the CPU metrics for Node-04. It wasn&#8217;t doing &#8220;data processing.&#8221; It was spending 99% of its cycles in <code>libc.so.6<\/code> moving memory around because some kid didn&#8217;t understand that a <strong>python list<\/strong> is a contiguous block. This is why the service was lagging. This is why the &#8220;heartbeat&#8221; failed. This is why I was paged at 3 AM.<\/p>\n<hr \/>\n<h3><span class=\"ez-toc-section\" id=\"SECTION_5_THE_64-BIT_TAX_AND_OBJECT_OVERHEAD\"><\/span>SECTION 5: THE 64-BIT TAX AND OBJECT OVERHEAD<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>We are running on 64-bit hardware. Everything is bigger. Every pointer in that <strong>python list<\/strong> is 8 bytes. In Python 3.11, the object headers are still massive. <\/p>\n<p>Let\u2019s look at the <code>PyObject<\/code> struct:<\/p>\n<pre class=\"codehilite\"><code class=\"language-c\">typedef struct _object {\n    _PyObject_HEAD_EXTRA\n    Py_ssize_t ob_refcnt;\n    struct _typeobject *ob_type;\n} PyObject;\n<\/code><\/pre>\n<p>Every single item you put in a <strong>python list<\/strong> carries this baggage. If you have a list of small strings, the overhead is even more insulting. A 1-character string in Python is about 50 bytes. <\/p>\n<p>When we hit 31GB of RSS (Resident Set Size), it wasn&#8217;t because we had 31GB of data. We had maybe 3GB of actual data and 28GB of Python&#8217;s &#8220;convenience.&#8221; The <strong>python list<\/strong> is the primary vehicle for this bloat. It encourages you to keep references to objects alive longer than they need to be. Because the list holds a reference, the garbage collector can&#8217;t touch the objects. Even if you &#8220;delete&#8221; the data elsewhere, if it\u2019s still in that <strong>python list<\/strong>, it\u2019s staying in RAM.<\/p>\n<p>And don&#8217;t get me started on the cyclic garbage collector. The <strong>python list<\/strong> is a container object, which means it\u2019s tracked by the GC&#8217;s linked lists for cycle detection. This adds even more overhead. Every time the GC runs, it has to traverse these massive lists, checking <code>ob_refcnt<\/code> and looking for cycles. With 10 million items, the GC pause times were hitting 500ms. The whole application just&#8230; stops.<\/p>\n<hr \/>\n<h3><span class=\"ez-toc-section\" id=\"SECTION_6_REMEDIATION_FOR_THE_INCOMPETENT\"><\/span>SECTION 6: REMEDIATION FOR THE INCOMPETENT<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>If I see another <strong>python list<\/strong> used for high-throughput data ingestion, I am going to start revoking git permissions. We have tools for this. Tools that don&#8217;t treat RAM like an infinite resource.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"1_Use_collectionsdeque_for_Queues\"><\/span>1. Use <code>collections.deque<\/code> for Queues<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>If you need to add things to the beginning and end, use a double-ended queue. It\u2019s implemented as a linked list of blocks. It doesn&#8217;t require <code>memmove()<\/code> for every insertion. It\u2019s $O(1)$ for <code>appendleft()<\/code>, unlike the <strong>python list<\/strong> which is $O(n)$.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"2_Use_arrayarray_for_Homogeneous_Data\"><\/span>2. Use <code>array.array<\/code> for Homogeneous Data<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>If you are storing 10 million integers, for the love of God, use the <code>array<\/code> module.<\/p>\n<pre class=\"codehilite\"><code class=\"language-python\">import array\n# This uses 4 bytes per integer. Period. No PyObject overhead for each element.\ndata = array.array('i', [0] * 1000000)\n<\/code><\/pre>\n<p>The <code>array.array<\/code> stores the actual raw C values in a contiguous block. It\u2019s compact. It\u2019s fast. It\u2019s what a <strong>python list<\/strong> pretends to be but isn&#8217;t.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"3_Use_NumPy_for_Numerical_Work\"><\/span>3. Use NumPy for Numerical Work<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>If you&#8217;re doing math, a <strong>python list<\/strong> is a joke. NumPy arrays are contiguous, they allow for SIMD instructions, and they don&#8217;t involve pointer indirection for every single addition.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"4_Pre-allocate_if_you_must_use_a_list\"><\/span>4. Pre-allocate if you must use a list<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>If you know you need 1,000,000 slots, don&#8217;t <code>append()<\/code> in a loop. That triggers the resize logic multiple times. Pre-allocate: <code>l = [None] * 1000000<\/code>. This sets the <code>allocated<\/code> size once. It\u2019s still a list of pointers, but at least you aren&#8217;t calling <code>realloc<\/code> and <code>memmove<\/code> twenty times while the list grows.<\/p>\n<hr \/>\n<h3><span class=\"ez-toc-section\" id=\"SECTION_7_THE_%E2%80%9CJUNIOR-LEVEL%E2%80%9D_CODE_VS_REALITY\"><\/span>SECTION 7: THE &#8220;JUNIOR-LEVEL&#8221; CODE VS. REALITY<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Let&#8217;s look at the &#8220;before&#8221; and &#8220;after&#8221; of the refactor I had to perform while hallucinating from sleep deprivation.<\/p>\n<p><strong>THE CRIME (Original Code):<\/strong><\/p>\n<pre class=\"codehilite\"><code class=\"language-python\"># Found in ingestor.py\nclass DataIngestor:\n    def __init__(self):\n        self.pending_records = [] # The ticking time bomb\n\n    def add_record(self, record):\n        # O(n) insertion. Absolute madness.\n        self.pending_records.insert(0, record) \n\n        # Memory grows indefinitely until OOM\n        if len(self.pending_records) &gt; 1000000:\n            self.process_batch()\n\n    def process_batch(self):\n        # Slicing creates a NEW list. Another memory allocation!\n        batch = self.pending_records[:500000]\n        self.pending_records = self.pending_records[500000:]\n        return batch\n<\/code><\/pre>\n<p><strong>THE REFACTOR (What I wrote at 4 AM):<\/strong><\/p>\n<pre class=\"codehilite\"><code class=\"language-python\">from collections import deque\n\nclass DataIngestor:\n    def __init__(self):\n        # Deque handles O(1) appends and pops from both ends\n        self.pending_records = deque()\n\n    def add_record(self, record):\n        # O(1) operation. No memmove.\n        self.pending_records.append(record)\n\n        if len(self.pending_records) &gt; 1000000:\n            self.process_batch()\n\n    def process_batch(self):\n        # No slicing. No new list creation.\n        batch = []\n        for _ in range(500000):\n            if self.pending_records:\n                batch.append(self.pending_records.popleft())\n        return batch\n<\/code><\/pre>\n<p>The refactored version dropped the memory usage of the process by 40% immediately. Why? Because we stopped slicing. In Python, <code>self.pending_records[:500000]<\/code> creates a <em>shallow copy<\/em>. That means it creates a <em>new<\/em> <strong>python list<\/strong> and copies 500,000 pointers into it. For a brief moment, you have the original list and the slice in memory at the same time. If you\u2019re already at 80% RAM usage, that slice is the bullet that kills the process.<\/p>\n<hr \/>\n<h3><span class=\"ez-toc-section\" id=\"SECTION_8_FINAL_GRIEVANCES\"><\/span>SECTION 8: FINAL GRIEVANCES<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>I am tired of explaining that &#8220;Python is slow&#8221; is a self-fulfilling prophecy written by people who don&#8217;t understand how a <strong>python list<\/strong> works. Python isn&#8217;t inherently slow; your use of its abstractions is incompetent. <\/p>\n<p>The <strong>python list<\/strong> is a tool. It is a general-purpose, flexible, dynamic array of pointers. It is not a database. It is not a message queue. It is not a high-performance numerical buffer. When you treat it as such, you are offloading the mental burden of memory management onto the hardware. But the hardware has limits. <\/p>\n<p>We lost two hours of production data because someone thought <code>list.insert(0, x)<\/code> was &#8220;cleaner&#8221; than using a <code>deque<\/code>. We lost $4,000 in cloud compute over-provisioning because the heap was so fragmented by millions of <code>int<\/code> objects that the OS couldn&#8217;t reclaim memory even after the list was cleared.<\/p>\n<p>Next time someone suggests we &#8220;just add more RAM&#8221; to fix a memory leak caused by a <strong>python list<\/strong>, I am resigning. We don&#8217;t need more RAM. We need developers who have read <code>listobject.c<\/code>. We need developers who understand that every time they type <code>[]<\/code>, they are making a contract with the CPython runtime\u2014a contract that says, &#8220;I am too lazy to manage memory, so please waste it for me.&#8221;<\/p>\n<p>The audit is complete. The server is back up. I am going home to sleep. If the &#8220;DataIngestor&#8221; crashes again because someone replaced the <code>deque<\/code> with a <strong>python list<\/strong> because &#8220;it&#8217;s more Pythonic,&#8221; don&#8217;t call me. Call a priest.<\/p>\n<p><strong>END OF REPORT.<\/strong><\/p>\n<hr \/>\n<h3><span class=\"ez-toc-section\" id=\"APPENDIX_A_MEMORY_BREAKDOWN_64-BIT\"><\/span>APPENDIX A: MEMORY BREAKDOWN (64-BIT)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Item<\/th>\n<th style=\"text-align: left;\">Size (Bytes)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>PyListObject<\/code> Header<\/td>\n<td style=\"text-align: left;\">56<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Single Pointer in <code>ob_item<\/code><\/td>\n<td style=\"text-align: left;\">8<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>PyObject<\/code> Header (Integer)<\/td>\n<td style=\"text-align: left;\">24<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Integer Value (Small)<\/td>\n<td style=\"text-align: left;\">4<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Total for 1 Integer in List<\/strong><\/td>\n<td style=\"text-align: left;\"><strong>88 (List overhead + Pointer + Object)<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Total for 1 Integer in <code>array.array<\/code><\/strong><\/td>\n<td style=\"text-align: left;\"><strong>4<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><em>Note: The 88 bytes for the first element includes the initial over-allocation of the list. Subsequent elements cost 8 bytes (pointer) + 28 bytes (object) until the next resize event.<\/em><\/p>\n<h3><span class=\"ez-toc-section\" id=\"APPENDIX_B_THE_GROWTH_CONSTANTS\"><\/span>APPENDIX B: THE GROWTH CONSTANTS<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>For those who still don&#8217;t get it, here is the growth table for a <strong>python list<\/strong> in 3.11:<\/p>\n<ul>\n<li>0 elements: 56 bytes (Allocated: 0)<\/li>\n<li>1-4 elements: 88 bytes (Allocated: 4)<\/li>\n<li>5-8 elements: 120 bytes (Allocated: 8)<\/li>\n<li>9-16 elements: 184 bytes (Allocated: 16)<\/li>\n<li>17-25 elements: 256 bytes (Allocated: 25)<\/li>\n<li>26-35 elements: 336 bytes (Allocated: 35)<\/li>\n<\/ul>\n<p>If you have 26 items, you are paying for 35. You are paying for 9 pointers to nowhere. Multiply that by the scale of our production environment, and you\u2019ll see why the CFO is asking why our AWS bill looks like a phone number.<\/p>\n<p><strong>SIGN-OFF:<\/strong><br \/>\n<em>Senior Systems Engineer, Infrastructure Recovery Team<\/em><br \/>\n<em>&#8220;I miss malloc.&#8221;<\/em><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Related_Articles\"><\/span>Related Articles<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Explore more insights and best practices:<\/p>\n<ul>\n<li><a href=\"https:\/\/itsupportwale.com\/blog\/installing-and-configuring-argo-cd-for-microservices-on-kubernetes\/\">Installing And Configuring Argo Cd For Microservices On Kubernetes<\/a><\/li>\n<li><a href=\"https:\/\/itsupportwale.com\/blog\/backup-all-mysql-databases-with-a-mysql-backup-script\/\">Backup All Mysql Databases With A Mysql Backup Script<\/a><\/li>\n<li><a href=\"https:\/\/itsupportwale.com\/blog\/whatsapps-long-awaited-security-feature-launched\/\">Whatsapps Long Awaited Security Feature Launched<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>INCIDENT REPORT #882-B: Why our heap looks like a disaster zone. DATE: October 14, 2023 TO: Engineering Lead, CTO, and anyone else who thinks &#8220;it&#8217;s just a script&#8221; FROM: Senior Systems Engineer (Level 4, Infrastructure) SUBJECT: Post-Mortem of the Node-04 Memory Exhaustion Event (Python 3.11.4) SYSTEM INCIDENT LOG: 2023-10-12T03:14:22Z 03:14:22 &#8211; CRITICAL &#8211; kernel: [99283.12] &#8230; <a title=\"Master the Python List: A Complete Guide with Examples\" class=\"read-more\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/\" aria-label=\"Read more  on Master the Python List: A Complete Guide with Examples\">Read more<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4480","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Master the Python List: A Complete Guide with Examples - ITSupportWale<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Master the Python List: A Complete Guide with Examples - ITSupportWale\" \/>\n<meta property=\"og:description\" content=\"INCIDENT REPORT #882-B: Why our heap looks like a disaster zone. DATE: October 14, 2023 TO: Engineering Lead, CTO, and anyone else who thinks &#8220;it&#8217;s just a script&#8221; FROM: Senior Systems Engineer (Level 4, Infrastructure) SUBJECT: Post-Mortem of the Node-04 Memory Exhaustion Event (Python 3.11.4) SYSTEM INCIDENT LOG: 2023-10-12T03:14:22Z 03:14:22 - CRITICAL - kernel: [99283.12] ... Read more\" \/>\n<meta property=\"og:url\" content=\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/\" \/>\n<meta property=\"og:site_name\" content=\"ITSupportWale\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Itsupportwale-298547177495978\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-24T15:29:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-17T10:26:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/itsupportwale.com\/blog\/wp-content\/uploads\/2021\/05\/android-chrome-512x512-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"512\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Techie\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Techie\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/\"},\"author\":{\"name\":\"Techie\",\"@id\":\"https:\/\/itsupportwale.com\/blog\/#\/schema\/person\/8c5a2b3d36396e0a8fd91ec8242fd46d\"},\"headline\":\"Master the Python List: A Complete Guide with Examples\",\"datePublished\":\"2026-01-24T15:29:47+00:00\",\"dateModified\":\"2026-02-17T10:26:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/\"},\"wordCount\":1899,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/itsupportwale.com\/blog\/#organization\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/\",\"url\":\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/\",\"name\":\"Master the Python List: A Complete Guide with Examples - ITSupportWale\",\"isPartOf\":{\"@id\":\"https:\/\/itsupportwale.com\/blog\/#website\"},\"datePublished\":\"2026-01-24T15:29:47+00:00\",\"dateModified\":\"2026-02-17T10:26:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/itsupportwale.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Master the Python List: A Complete Guide with Examples\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/itsupportwale.com\/blog\/#website\",\"url\":\"https:\/\/itsupportwale.com\/blog\/\",\"name\":\"ITSupportWale\",\"description\":\"Tips, Tricks, Fixed-Errors, Tutorials &amp; Guides\",\"publisher\":{\"@id\":\"https:\/\/itsupportwale.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/itsupportwale.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/itsupportwale.com\/blog\/#organization\",\"name\":\"itsupportwale\",\"url\":\"https:\/\/itsupportwale.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/itsupportwale.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/itsupportwale.com\/blog\/wp-content\/uploads\/2023\/09\/cropped-Logo-trans-without-slogan.png\",\"contentUrl\":\"https:\/\/itsupportwale.com\/blog\/wp-content\/uploads\/2023\/09\/cropped-Logo-trans-without-slogan.png\",\"width\":1119,\"height\":144,\"caption\":\"itsupportwale\"},\"image\":{\"@id\":\"https:\/\/itsupportwale.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Itsupportwale-298547177495978\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/itsupportwale.com\/blog\/#\/schema\/person\/8c5a2b3d36396e0a8fd91ec8242fd46d\",\"name\":\"Techie\",\"sameAs\":[\"https:\/\/itsupportwale.com\",\"iswblogadmin\"],\"url\":\"https:\/\/itsupportwale.com\/blog\/author\/iswblogadmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Master the Python List: A Complete Guide with Examples - ITSupportWale","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/","og_locale":"en_US","og_type":"article","og_title":"Master the Python List: A Complete Guide with Examples - ITSupportWale","og_description":"INCIDENT REPORT #882-B: Why our heap looks like a disaster zone. DATE: October 14, 2023 TO: Engineering Lead, CTO, and anyone else who thinks &#8220;it&#8217;s just a script&#8221; FROM: Senior Systems Engineer (Level 4, Infrastructure) SUBJECT: Post-Mortem of the Node-04 Memory Exhaustion Event (Python 3.11.4) SYSTEM INCIDENT LOG: 2023-10-12T03:14:22Z 03:14:22 - CRITICAL - kernel: [99283.12] ... Read more","og_url":"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/","og_site_name":"ITSupportWale","article_publisher":"https:\/\/www.facebook.com\/Itsupportwale-298547177495978","article_published_time":"2026-01-24T15:29:47+00:00","article_modified_time":"2026-02-17T10:26:58+00:00","og_image":[{"width":512,"height":512,"url":"https:\/\/itsupportwale.com\/blog\/wp-content\/uploads\/2021\/05\/android-chrome-512x512-1.png","type":"image\/png"}],"author":"Techie","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Techie","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#article","isPartOf":{"@id":"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/"},"author":{"name":"Techie","@id":"https:\/\/itsupportwale.com\/blog\/#\/schema\/person\/8c5a2b3d36396e0a8fd91ec8242fd46d"},"headline":"Master the Python List: A Complete Guide with Examples","datePublished":"2026-01-24T15:29:47+00:00","dateModified":"2026-02-17T10:26:58+00:00","mainEntityOfPage":{"@id":"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/"},"wordCount":1899,"commentCount":0,"publisher":{"@id":"https:\/\/itsupportwale.com\/blog\/#organization"},"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/","url":"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/","name":"Master the Python List: A Complete Guide with Examples - ITSupportWale","isPartOf":{"@id":"https:\/\/itsupportwale.com\/blog\/#website"},"datePublished":"2026-01-24T15:29:47+00:00","dateModified":"2026-02-17T10:26:58+00:00","breadcrumb":{"@id":"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/itsupportwale.com\/blog\/master-the-python-list-a-complete-guide-with-examples\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/itsupportwale.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Master the Python List: A Complete Guide with Examples"}]},{"@type":"WebSite","@id":"https:\/\/itsupportwale.com\/blog\/#website","url":"https:\/\/itsupportwale.com\/blog\/","name":"ITSupportWale","description":"Tips, Tricks, Fixed-Errors, Tutorials &amp; Guides","publisher":{"@id":"https:\/\/itsupportwale.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/itsupportwale.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/itsupportwale.com\/blog\/#organization","name":"itsupportwale","url":"https:\/\/itsupportwale.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/itsupportwale.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/itsupportwale.com\/blog\/wp-content\/uploads\/2023\/09\/cropped-Logo-trans-without-slogan.png","contentUrl":"https:\/\/itsupportwale.com\/blog\/wp-content\/uploads\/2023\/09\/cropped-Logo-trans-without-slogan.png","width":1119,"height":144,"caption":"itsupportwale"},"image":{"@id":"https:\/\/itsupportwale.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Itsupportwale-298547177495978"]},{"@type":"Person","@id":"https:\/\/itsupportwale.com\/blog\/#\/schema\/person\/8c5a2b3d36396e0a8fd91ec8242fd46d","name":"Techie","sameAs":["https:\/\/itsupportwale.com","iswblogadmin"],"url":"https:\/\/itsupportwale.com\/blog\/author\/iswblogadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/itsupportwale.com\/blog\/wp-json\/wp\/v2\/posts\/4480","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itsupportwale.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itsupportwale.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itsupportwale.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/itsupportwale.com\/blog\/wp-json\/wp\/v2\/comments?post=4480"}],"version-history":[{"count":4,"href":"https:\/\/itsupportwale.com\/blog\/wp-json\/wp\/v2\/posts\/4480\/revisions"}],"predecessor-version":[{"id":4656,"href":"https:\/\/itsupportwale.com\/blog\/wp-json\/wp\/v2\/posts\/4480\/revisions\/4656"}],"wp:attachment":[{"href":"https:\/\/itsupportwale.com\/blog\/wp-json\/wp\/v2\/media?parent=4480"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itsupportwale.com\/blog\/wp-json\/wp\/v2\/categories?post=4480"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itsupportwale.com\/blog\/wp-json\/wp\/v2\/tags?post=4480"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}