[{"data":1,"prerenderedAt":306},["ShallowReactive",2],{"tag-labels":3,"site-header":4,"article-jawaban-nilai-default-cuma-dibuat-sekali-id":69},{},{"featuredPost":5,"navigations":26},{"id":6,"title":7,"title_en":8,"slug":9,"excerpt":10,"excerpt_en":8,"has_translation":11,"published_at":12,"reading_time":13,"hidden_from_listing":11,"tags":14,"thumbnail_image":8,"og_image":19,"series":20,"authors":25},110,"Ketika Pilih Framework Cuma Biar Kelihatan Beda",null,"ketika-pilih-framework-cuma-biar-kelihatan-beda","Terakhir kali kamu milih framework atau library baru, itu karena masalahmu butuh alat itu, atau karena alatnya kedengaran keren dan belum banyak yang pakai? Pertanyaan ini nggak enak dijawab. Soalnya keputusan teknologi sering diambil dengan alasan yang nggak pernah ditulis di dokumen teknis mana pun.",false,"2026-10-06T15:25:21.000Z",5,[15,16,17,18],"karier","framework","opini","pengalaman","\u002Fog\u002Fketika-pilih-framework-cuma-biar-kelihatan-beda.png",{"id":21,"title":22,"title_en":23,"slug":24},9,"Artikel","Articles","all",[],[27,43,64],{"collection":28,"item":29},"series",{"__typename":28,"title":22,"title_en":23,"slug":24,"children_series":30},[31,35,39],{"title":32,"title_en":33,"slug":34},"Kecerdasan Artifisial","Artificial Intelligence","kecerdasan-artifisial",{"title":36,"title_en":37,"slug":38},"Konsep Dasar Pemrograman","Programming Fundamentals","konsep-dasar-pemrograman",{"title":40,"title_en":41,"slug":42},"Algoritma dan Struktur Data","Algorithms and Data Structures","algoritma-struktur-data",{"collection":28,"item":44},{"__typename":28,"title":45,"title_en":45,"slug":46,"children_series":47},"Tutorial","tutorial",[48,52,56,60],{"title":49,"title_en":50,"slug":51},"Belajar Python","Learning Python","belajar-python",{"title":53,"title_en":54,"slug":55},"Belajar Golang","Learning Go","belajar-golang",{"title":57,"title_en":58,"slug":59},"Belajar Java","Learning Java","belajar-java",{"title":61,"title_en":62,"slug":63},"Belajar Pascal","Learning Pascal","belajar-pascal",{"collection":28,"item":65},{"__typename":28,"title":66,"title_en":66,"slug":67,"children_series":68},"Lab","lab",[],{"article":70,"renderedBody":182,"renderedTakeaway":183,"latestArticles":184,"toc":283},{"id":71,"title":72,"title_en":73,"slug":74,"excerpt":75,"excerpt_en":76,"has_translation":77,"published_at":78,"reading_time":79,"hidden_from_listing":77,"tags":80,"thumbnail_image":8,"og_image":84,"series":85,"authors":173,"body_locale":176,"available_locales":177,"body":179,"takeway":180,"prerequisite":181},121,"Jawabannya: Nilai Default Itu Cuma Dibuat Sekali","The answer: A Default Value Is Created Once","jawaban-nilai-default-cuma-dibuat-sekali","Tiga gejala yang kelihatan seperti satu penyakit, padahal tiga lapis beda dengan obat masing-masing. Ini urutan perbaikannya.","Three symptoms that look like one disease, when they are three different layers with three different cures. Here is the order of repair.",true,"2026-10-11T23:00:15.000Z",4,[81,82,83,67],"python","scope","mutasi","\u002Fog\u002Fjawaban-nilai-default-cuma-dibuat-sekali.png",{"id":86,"title":66,"title_en":66,"slug":67,"description":87,"description_en":88,"articles":89,"children_series":172,"parent_series":8},29,"Lab praktik: kerjakan masalahnya dulu, baru lihat jawabannya. Tiap lab punya repo yang bisa di-clone, data seukuran produksi, dan target yang harus kamu capai sendiri. Artikel jawabannya ada di seri ini juga, dan cuma bisa kamu buka dari artikel masalahnya.","Practice labs: work the problem first, then read the answer. Every lab ships with a repo you can clone, production-sized data, and a target you have to hit yourself. The write-up lives in this series too, and it only opens from the problem article.",[90,111,128,144,157],{"id":91,"title":92,"title_en":93,"slug":94,"excerpt":95,"excerpt_en":96,"has_translation":77,"published_at":97,"reading_time":13,"hidden_from_listing":11,"tags":98,"thumbnail_image":8,"og_image":102,"series":103,"authors":104},104,"Query-nya Tinggal 2, Tapi Response-nya Masih 1 Detik","N+1 Was Never the Bottleneck: 41 Queries Down to 2, Still One Second","query-tinggal-2-tapi-response-masih-1-detik","Endpoint feed yang cuma menampilkan 20 tulisan butuh satu detik, dan server database dihujani 41 query. Kamu kerjakan nasihat N+1 yang standar, query-nya turun jadi 2, dan latency-nya nggak bergerak. Ini versi \"apa adanya\" dari masalah itu, plus lab-nya.","A feed endpoint that shows 20 posts takes a full second and hits the database with 41 queries. Apply the standard N+1 advice, get it down to 2 queries, and the latency does not move. This is that problem as it happened, plus the lab.","2026-10-04T09:59:21.000Z",[99,100,101],"database","performance","backend","\u002Fog\u002Fquery-tinggal-2-tapi-response-masih-1-detik.png",{"id":86,"title":66,"title_en":66,"slug":67},[105],{"authors_id":106},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":8},1,"Daffa Izzuddin","izzudd","Writer",{"id":112,"title":113,"title_en":114,"slug":115,"excerpt":116,"excerpt_en":117,"has_translation":77,"published_at":118,"reading_time":79,"hidden_from_listing":11,"tags":119,"thumbnail_image":8,"og_image":123,"series":124,"authors":125},114,"Saldo Naik Empat Kali untuk Satu Pembayaran","One Payment, Four Ledger Rows: An Idempotency Lab","saldo-naik-empat-kali-untuk-satu-pembayaran","Kodenya nggak salah, dan gateway-nya juga nggak salah. Tapi satu pembayaran muncul empat kali di ledger. Coba tebak kenapa — lalu bikin `make check` hijau di lab-nya.","The code is not wrong and the gateway is not wrong, yet one payment shows up four times in the ledger. Guess why, then make `make check` green in the lab.","2026-10-11T13:45:00.000Z",[120,121,122,99,67],"idempotency","webhook","postgres","\u002Fog\u002Fsaldo-naik-empat-kali-untuk-satu-pembayaran.png",{"id":86,"title":66,"title_en":66,"slug":67},[126],{"authors_id":127},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":8},{"id":129,"title":130,"title_en":131,"slug":132,"excerpt":133,"excerpt_en":134,"has_translation":77,"published_at":135,"reading_time":136,"hidden_from_listing":11,"tags":137,"thumbnail_image":8,"og_image":139,"series":140,"authors":141},116,"Webhook-nya Telat, Job Rekonsiliasinya Keburu Jalan","The Webhook Arrived Late. The Reconciliation Job Had Already Run.","webhook-telat-job-rekonsiliasi-keburu-jalan","Jalur webhook sudah idempotent. Lalu ada job rekonsiliasi pagi, dan satu pembayaran tercatat dua kali dari dua jalur yang dua-duanya benar. Coba tebak kuncinya salah di mana.","The webhook path is already idempotent. Then a morning reconciliation job appears, and one payment gets recorded twice from two paths that are both right. Guess where the key is wrong.","2026-10-11T13:44:00.000Z",3,[120,138,121,122,67],"reconciliation","\u002Fog\u002Fwebhook-telat-job-rekonsiliasi-keburu-jalan.png",{"id":86,"title":66,"title_en":66,"slug":67},[142],{"authors_id":143},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":8},{"id":145,"title":146,"title_en":147,"slug":148,"excerpt":149,"excerpt_en":150,"has_translation":77,"published_at":78,"reading_time":79,"hidden_from_listing":11,"tags":151,"thumbnail_image":8,"og_image":152,"series":153,"authors":154},120,"Tiap Nota di Kafe Ini Isinya Pesanan yang Sama","Every Receipt in This Café Lists the Same Order","tiap-nota-isinya-pesanan-yang-sama","Nota tiap meja isinya sama semua, dan totalnya Rp0 — padahal tiap meja cuma pesan satu barang. Coba tebak kenapa.","Every table's receipt holds the same items, and the total is Rp0 — even though each table ordered exactly one thing. Guess why, then make `make check` green. A Python scope and mutation lab.",[81,82,83,67],"\u002Fog\u002Ftiap-nota-isinya-pesanan-yang-sama.png",{"id":86,"title":66,"title_en":66,"slug":67},[155],{"authors_id":156},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":8},{"id":158,"title":159,"title_en":160,"slug":161,"excerpt":162,"excerpt_en":163,"has_translation":77,"published_at":78,"reading_time":79,"hidden_from_listing":11,"tags":164,"thumbnail_image":8,"og_image":167,"series":168,"authors":169},122,"Script yang Nggak Bisa Bilang di Mana Salahnya","A Script That Cannot Say Where It Went Wrong","script-yang-tidak-bilang-di-mana-salahnya","Script yang berhenti di baris jelek pertama cuma melaporkan sebagian masalah yang ada. Ini yang muncul di layar sekarang.","A script that stops at the first bad line reports only part of the problem. This is what shows up on screen right now.",[81,165,166,67],"error-handling","validasi","\u002Fog\u002Fscript-yang-tidak-bilang-di-mana-salahnya.png",{"id":86,"title":66,"title_en":66,"slug":67},[170],{"authors_id":171},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":8},[],[174],{"authors_id":175},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":8},"id",[178,176],"en","Yang menarik dari lab ini bukan satu jawabannya, tapi **kenapa ada tiga**. Tiga gejala — nota yang isinya sama, total Rp0, kas Rp0 — kelihatan seperti satu penyakit. Padahal tiga lapisnya beda, dan tiap lapis punya obat yang beda.\n\nTemanya cuma satu, dan ini yang paling layak dibawa pulang: **mana yang kamu ubah, dan benda apa itu sebenarnya.** Tiap lapis rusak karena penulisnya mengira dia mengubah satu benda, padahal yang dia ubah benda lain — atau nggak mengubah apa pun.\n\n## Hasil pengukuran\n\nPemeriksaannya enam. Angka di kolom kanan: berapa yang masih merah.\n\n| varian | merah |\n|---|---|\n| kondisi awal | **6 dari 6** |\n| cuma memperbaiki lapis 1 | **4 dari 6** |\n| ketiga lapis sekaligus | **0 dari 6** (hijau) |\n\nBaris tengah itu yang paling sering kelewat. Memperbaiki lapis yang paling terkenal saja masih menyisakan 4 dari 6 merah, sebab dua masalah lain ada di tempat yang beda.\n\n## Lapis 1 — *nilai default* yang dihitung sekali\n\nIni lapis yang paling dikenal orang.\n\n```python\ndef pesanan_baru(meja, item=[]):   # salah\n```\n\nKelihatannya wajar: \"kalau pemanggil nggak mengirim item, bikin *list* kosong baru.\" Yang nggak kelihatan: **nilai default sebuah fungsi dihitung sekali**, waktu fungsinya baru didefinisikan di memori, bukan tiap kali dipanggil. Jadi `[]` di situ bukan list kosong baru setiap panggilan — dia satu *list* yang sama, dipakai ulang selamanya. Semua nota berbagi *list* itu.\n\n```python\ndef pesanan_baru(meja, item=None):   # benar\n    if item is None:\n        item = []\n    return {\"meja\": meja, \"item\": item, \"total\": 0}\n```\n\nKamu nggak perlu percaya kata orang; cek sendiri:\n\n```python\nkasir.pesanan_baru(1)[\"item\"] is kasir.pesanan_baru(2)[\"item\"]   # harus False\n```\n\nBahkan buktinya nggak perlu ditakar: `pesanan_baru.__defaults__` menyimpan list itu secara harfiah. Isi satu nota, lalu lihat `__defaults__` — item yang baru kamu masukkan muncul di situ juga, karena `pesanan[\"item\"]` dan *nilai default* itu **benda yang sama**. Perhatikan juga: `pesanan_baru` sendiri nggak pernah menambah apa pun ke list itu. Yang menambah adalah fungsi lain, dan tetap saja list itu bertambah — karena cuma ada satu.\n\n## Lapis 2 — mengubah nama lokal, bukan nilai di dalam *dict*\n\n```python\ntotal = pesanan[\"total\"]        # menyalin NILAI\ntotal = total + harga * qty     # cuma nama lokal yang berubah\nreturn pesanan                  # nota nggak pernah tahu\n```\n\n`total = pesanan[\"total\"]` bikin nama baru `total` yang menunjuk ke angka yang sama. Baris berikutnya mengubah angka di nama itu — tapi `pesanan` masih memegang angka lama. Nama lokal mati begitu fungsinya selesai.\n\n```python\npesanan[\"total\"] = pesanan[\"total\"] + harga * qty   # benar\n```\n\nBedanya halus, tapi ini intinya: yang diubah adalah **isi *dict* yang dipegang pemanggil**. Mengubah nama variabel belum tentu mengubah benda yang kamu maksud — nama yang sama di dua tempat bukan jaminan benda yang sama.\n\n## Lapis 3 — nama milik modul, atau nama milik fungsi\n\n```python\nTOTAL_KAS = 0\n\ndef catat_penjualan(jumlah):\n    total = TOTAL_KAS        # bikin nama lokal baru\n    total = total + jumlah   # cuma lokalnya yang berubah\n    return total             # TOTAL_KAS nggak pernah tersentuh\n```\n\nPenulis aslinya berhenti di tengah jalan: niatnya menambah ke `TOTAL_KAS`, tapi menulisnya lewat variabel lain. Akibatnya `TOTAL_KAS` tetap nol sampai kapan pun. Kalau dia menulisnya langsung tanpa bilang ke Python bahwa nama itu milik modul:\n\n```python\ndef catat_penjualan(jumlah):\n    TOTAL_KAS = TOTAL_KAS + jumlah   # UnboundLocalError\n```\n\nPython malah melempar `UnboundLocalError`. Sebabnya: begitu ada penugasan ke sebuah nama di dalam fungsi, Python menganggap nama itu **lokal** untuk seluruh fungsi tersebut. Waktu dia membaca `TOTAL_KAS` di sebelah kanan, Python belum menganggapnya ada. Ironisnya error itu justru lebih baik, karena keliatan. Penulis aslinya menghindarinya, dan itu yang bikin bugnya senyap.\n\n```python\ndef catat_penjualan(jumlah):\n    global TOTAL_KAS                 # benar\n    TOTAL_KAS = TOTAL_KAS + jumlah\n    return TOTAL_KAS\n```\n\n`global` bilang ke Python: nama `TOTAL_KAS` di sini menunjuk yang di tingkat modul, bukan bikin yang baru di sini.\n\n## Jebakan yang gampang kejeblos\n\n**`item or []` sebagai ganti `if item is None`.** Kelihatan lebih ringkas dan di demo ini tetap benar — tapi salah begitu ada pemanggil yang sengaja mengirim *list* kosong sebagai *argumen*, karena `item or []` menggantinya dengan *list* baru, padahal pemanggil mau mengisi list yang dia kirim.\n\n**Nambah `.copy()` di mana-mana** biar nggak ada yang saling nimpa. `.copy()` bikin wadah baru, bukan isi baru. Kalau isinya benda yang bisa berubah juga, salinannya masih berbagi isi dengan aslinya. Sebelum menambah salinan, tanya dulu: yang mau kamu pisahkan wadahnya atau isinya?\n\n**Ganti nama variabel biar \"beda\".** Kalau `total` diganti jadi `total_nota`, bugnya nggak hilang — cuma pindah nama. Yang salah bukan namanya, tapi fakta bahwa yang berubah adalah nama lokal dan bukan nilai di dalam *dict*.\n\n## Setelah ketiganya beres\n\n```bash\nmake check    # harus 6 dari 6 LULUS\nmake demo     # tiga meja, tiga nota, sesuai pesanannya\n```\n\nDi situ `make demo` berhenti mengeluh, dan tiga notanya jadi tiga nota yang beda: meja 1 kopi x2 dengan total Rp30.000, meja 3 teh x1 Rp8.000, meja 5 roti x1 Rp12.000, kas harian Rp50.000.\n\nDan pertanyaan yang paling berguna buat dibawa keluar lab ini bukan \"di mana bugnya\", tapi yang satu ini: **waktu kamu menulis `x = ...`, benda mana yang sebenarnya kamu ubah?** Jawab itu dengan benar, dan ketiga lapis di atas berhenti jadi misteri.\n\n## Pertanyaan buat kamu\n\n1. Kalau `pesanan_baru` menerima list dari pemanggilnya, siapa yang seharusnya bertanggung jawab waktu list itu berubah setelahnya — yang mengirim, atau yang menerima?\n2. Lapis 2 dan lapis 3 kelihatan seperti dua bug yang beda. Tapi keduanya bisa diringkas jadi satu pertanyaan yang sama persis. Pertanyaan apa itu?\n3. Kalau `TOTAL_KAS` bukan angka melainkan dict, misalnya `{\"kas\": 0}`, apakah lapis 3 masih perlu bilang ke Python bahwa nama itu milik modul? Coba di kertas dulu, baru di terminal.\n","- Tiga lapis beda, satu tema: mana yang kamu ubah, dan benda apa itu sebenarnya.\n- Nilai default sebuah fungsi dihitung sekali, jadi list di nilai default-nya dipakai bersama selamanya.\n- Mengubah nama lokal nggak mengubah isi *dict* yang dipegang pemanggil.\n- Nama yang diubah di dalam fungsi dianggap lokal, kecuali kamu bilang terus terang bahwa itu milik modul.\n- Memperbaiki lapis 1 saja masih menyisakan 4 dari 6 merah.",{"id":145,"title":146,"slug":148},"\u003Cp>Yang menarik dari lab ini bukan satu jawabannya, tapi \u003Cstrong>kenapa ada tiga\u003C\u002Fstrong>. Tiga gejala — nota yang isinya sama, total Rp0, kas Rp0 — kelihatan seperti satu penyakit. Padahal tiga lapisnya beda, dan tiap lapis punya obat yang beda.\u003C\u002Fp>\n\u003Cp>Temanya cuma satu, dan ini yang paling layak dibawa pulang: \u003Cstrong>mana yang kamu ubah, dan benda apa itu sebenarnya.\u003C\u002Fstrong> Tiap lapis rusak karena penulisnya mengira dia mengubah satu benda, padahal yang dia ubah benda lain — atau nggak mengubah apa pun.\u003C\u002Fp>\n\u003Ch2 id=\"hasil-pengukuran\">Hasil pengukuran\u003C\u002Fh2>\n\u003Cp>Pemeriksaannya enam. Angka di kolom kanan: berapa yang masih merah.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>varian\u003C\u002Fth>\n\u003Cth>merah\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>kondisi awal\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>6 dari 6\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>cuma memperbaiki lapis 1\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>4 dari 6\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>ketiga lapis sekaligus\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>0 dari 6\u003C\u002Fstrong> (hijau)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>Baris tengah itu yang paling sering kelewat. Memperbaiki lapis yang paling terkenal saja masih menyisakan 4 dari 6 merah, sebab dua masalah lain ada di tempat yang beda.\u003C\u002Fp>\n\u003Ch2 id=\"lapis-1-nilai-default-yang-dihitung-sekali\">Lapis 1 — \u003Cem>nilai default\u003C\u002Fem> yang dihitung sekali\u003C\u002Fh2>\n\u003Cp>Ini lapis yang paling dikenal orang.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"def%20pesanan_baru(meja%2C%20item%3D%5B%5D)%3A%20%20%20%23%20salah\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> pesanan_baru\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(meja, item\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">[]):   \u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\"># salah\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Kelihatannya wajar: &quot;kalau pemanggil nggak mengirim item, bikin \u003Cem>list\u003C\u002Fem> kosong baru.&quot; Yang nggak kelihatan: \u003Cstrong>nilai default sebuah fungsi dihitung sekali\u003C\u002Fstrong>, waktu fungsinya baru didefinisikan di memori, bukan tiap kali dipanggil. Jadi \u003Ccode>[]\u003C\u002Fcode> di situ bukan list kosong baru setiap panggilan — dia satu \u003Cem>list\u003C\u002Fem> yang sama, dipakai ulang selamanya. Semua nota berbagi \u003Cem>list\u003C\u002Fem> itu.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"def%20pesanan_baru(meja%2C%20item%3DNone)%3A%20%20%20%23%20benar%0A%20%20%20%20if%20item%20is%20None%3A%0A%20%20%20%20%20%20%20%20item%20%3D%20%5B%5D%0A%20%20%20%20return%20%7B%22meja%22%3A%20meja%2C%20%22item%22%3A%20item%2C%20%22total%22%3A%200%7D\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> pesanan_baru\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(meja, item\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">None\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">):   \u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\"># benar\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> item \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">is\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> None\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        item \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> []\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"meja\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">: meja, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"item\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">: item, \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"total\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">0\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Kamu nggak perlu percaya kata orang; cek sendiri:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"kasir.pesanan_baru(1)%5B%22item%22%5D%20is%20kasir.pesanan_baru(2)%5B%22item%22%5D%20%20%20%23%20harus%20False\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">kasir.pesanan_baru(\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">1\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)[\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"item\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">] \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">is\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> kasir.pesanan_baru(\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">2\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)[\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"item\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">]   \u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\"># harus False\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Bahkan buktinya nggak perlu ditakar: \u003Ccode>pesanan_baru.__defaults__\u003C\u002Fcode> menyimpan list itu secara harfiah. Isi satu nota, lalu lihat \u003Ccode>__defaults__\u003C\u002Fcode> — item yang baru kamu masukkan muncul di situ juga, karena \u003Ccode>pesanan[&quot;item&quot;]\u003C\u002Fcode> dan \u003Cem>nilai default\u003C\u002Fem> itu \u003Cstrong>benda yang sama\u003C\u002Fstrong>. Perhatikan juga: \u003Ccode>pesanan_baru\u003C\u002Fcode> sendiri nggak pernah menambah apa pun ke list itu. Yang menambah adalah fungsi lain, dan tetap saja list itu bertambah — karena cuma ada satu.\u003C\u002Fp>\n\u003Ch2 id=\"lapis-2-mengubah-nama-lokal-bukan-nilai-di-dalam-dict\">Lapis 2 — mengubah nama lokal, bukan nilai di dalam \u003Cem>dict\u003C\u002Fem>\u003C\u002Fh2>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"total%20%3D%20pesanan%5B%22total%22%5D%20%20%20%20%20%20%20%20%23%20menyalin%20NILAI%0Atotal%20%3D%20total%20%2B%20harga%20*%20qty%20%20%20%20%20%23%20cuma%20nama%20lokal%20yang%20berubah%0Areturn%20pesanan%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20nota%20nggak%20pernah%20tahu\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">total \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> pesanan[\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"total\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">]        \u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\"># menyalin NILAI\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">total \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> total \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">+\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> harga \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> qty     \u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\"># cuma nama lokal yang berubah\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">return\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> pesanan                  \u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\"># nota nggak pernah tahu\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>\u003Ccode>total = pesanan[&quot;total&quot;]\u003C\u002Fcode> bikin nama baru \u003Ccode>total\u003C\u002Fcode> yang menunjuk ke angka yang sama. Baris berikutnya mengubah angka di nama itu — tapi \u003Ccode>pesanan\u003C\u002Fcode> masih memegang angka lama. Nama lokal mati begitu fungsinya selesai.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"pesanan%5B%22total%22%5D%20%3D%20pesanan%5B%22total%22%5D%20%2B%20harga%20*%20qty%20%20%20%23%20benar\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">pesanan[\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"total\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">] \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> pesanan[\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">\"total\"\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">] \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">+\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> harga \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">*\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> qty   \u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\"># benar\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Bedanya halus, tapi ini intinya: yang diubah adalah \u003Cstrong>isi \u003Cem>dict\u003C\u002Fem> yang dipegang pemanggil\u003C\u002Fstrong>. Mengubah nama variabel belum tentu mengubah benda yang kamu maksud — nama yang sama di dua tempat bukan jaminan benda yang sama.\u003C\u002Fp>\n\u003Ch2 id=\"lapis-3-nama-milik-modul-atau-nama-milik-fungsi\">Lapis 3 — nama milik modul, atau nama milik fungsi\u003C\u002Fh2>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"TOTAL_KAS%20%3D%200%0A%0Adef%20catat_penjualan(jumlah)%3A%0A%20%20%20%20total%20%3D%20TOTAL_KAS%20%20%20%20%20%20%20%20%23%20bikin%20nama%20lokal%20baru%0A%20%20%20%20total%20%3D%20total%20%2B%20jumlah%20%20%20%23%20cuma%20lokalnya%20yang%20berubah%0A%20%20%20%20return%20total%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20TOTAL_KAS%20nggak%20pernah%20tersentuh\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">TOTAL_KAS\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> 0\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> catat_penjualan\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(jumlah):\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    total \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> TOTAL_KAS\u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\">        # bikin nama lokal baru\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    total \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> total \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">+\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> jumlah   \u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\"># cuma lokalnya yang berubah\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> total             \u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\"># TOTAL_KAS nggak pernah tersentuh\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Penulis aslinya berhenti di tengah jalan: niatnya menambah ke \u003Ccode>TOTAL_KAS\u003C\u002Fcode>, tapi menulisnya lewat variabel lain. Akibatnya \u003Ccode>TOTAL_KAS\u003C\u002Fcode> tetap nol sampai kapan pun. Kalau dia menulisnya langsung tanpa bilang ke Python bahwa nama itu milik modul:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"def%20catat_penjualan(jumlah)%3A%0A%20%20%20%20TOTAL_KAS%20%3D%20TOTAL_KAS%20%2B%20jumlah%20%20%20%23%20UnboundLocalError\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> catat_penjualan\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(jumlah):\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    TOTAL_KAS\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> TOTAL_KAS\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> jumlah   \u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\"># UnboundLocalError\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Python malah melempar \u003Ccode>UnboundLocalError\u003C\u002Fcode>. Sebabnya: begitu ada penugasan ke sebuah nama di dalam fungsi, Python menganggap nama itu \u003Cstrong>lokal\u003C\u002Fstrong> untuk seluruh fungsi tersebut. Waktu dia membaca \u003Ccode>TOTAL_KAS\u003C\u002Fcode> di sebelah kanan, Python belum menganggapnya ada. Ironisnya error itu justru lebih baik, karena keliatan. Penulis aslinya menghindarinya, dan itu yang bikin bugnya senyap.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"def%20catat_penjualan(jumlah)%3A%0A%20%20%20%20global%20TOTAL_KAS%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20benar%0A%20%20%20%20TOTAL_KAS%20%3D%20TOTAL_KAS%20%2B%20jumlah%0A%20%20%20%20return%20TOTAL_KAS\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\"> catat_penjualan\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(jumlah):\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    global\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> TOTAL_KAS\u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\">                 # benar\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    TOTAL_KAS\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> TOTAL_KAS\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\"> +\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> jumlah\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\"> TOTAL_KAS\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>\u003Ccode>global\u003C\u002Fcode> bilang ke Python: nama \u003Ccode>TOTAL_KAS\u003C\u002Fcode> di sini menunjuk yang di tingkat modul, bukan bikin yang baru di sini.\u003C\u002Fp>\n\u003Ch2 id=\"jebakan-yang-gampang-kejeblos\">Jebakan yang gampang kejeblos\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>\u003Ccode>item or []\u003C\u002Fcode> sebagai ganti \u003Ccode>if item is None\u003C\u002Fcode>.\u003C\u002Fstrong> Kelihatan lebih ringkas dan di demo ini tetap benar — tapi salah begitu ada pemanggil yang sengaja mengirim \u003Cem>list\u003C\u002Fem> kosong sebagai \u003Cem>argumen\u003C\u002Fem>, karena \u003Ccode>item or []\u003C\u002Fcode> menggantinya dengan \u003Cem>list\u003C\u002Fem> baru, padahal pemanggil mau mengisi list yang dia kirim.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Nambah \u003Ccode>.copy()\u003C\u002Fcode> di mana-mana\u003C\u002Fstrong> biar nggak ada yang saling nimpa. \u003Ccode>.copy()\u003C\u002Fcode> bikin wadah baru, bukan isi baru. Kalau isinya benda yang bisa berubah juga, salinannya masih berbagi isi dengan aslinya. Sebelum menambah salinan, tanya dulu: yang mau kamu pisahkan wadahnya atau isinya?\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Ganti nama variabel biar &quot;beda&quot;.\u003C\u002Fstrong> Kalau \u003Ccode>total\u003C\u002Fcode> diganti jadi \u003Ccode>total_nota\u003C\u002Fcode>, bugnya nggak hilang — cuma pindah nama. Yang salah bukan namanya, tapi fakta bahwa yang berubah adalah nama lokal dan bukan nilai di dalam \u003Cem>dict\u003C\u002Fem>.\u003C\u002Fp>\n\u003Ch2 id=\"setelah-ketiganya-beres\">Setelah ketiganya beres\u003C\u002Fh2>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">BASH\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"make%20check%20%20%20%20%23%20harus%206%20dari%206%20LULUS%0Amake%20demo%20%20%20%20%20%23%20tiga%20meja%2C%20tiga%20nota%2C%20sesuai%20pesanannya\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Copy\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">make\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> check\u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\">    # harus 6 dari 6 LULUS\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">make\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\"> demo\u003C\u002Fspan>\u003Cspan style=\"color:#6A737D\">     # tiga meja, tiga nota, sesuai pesanannya\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Di situ \u003Ccode>make demo\u003C\u002Fcode> berhenti mengeluh, dan tiga notanya jadi tiga nota yang beda: meja 1 kopi x2 dengan total Rp30.000, meja 3 teh x1 Rp8.000, meja 5 roti x1 Rp12.000, kas harian Rp50.000.\u003C\u002Fp>\n\u003Cp>Dan pertanyaan yang paling berguna buat dibawa keluar lab ini bukan &quot;di mana bugnya&quot;, tapi yang satu ini: \u003Cstrong>waktu kamu menulis \u003Ccode>x = ...\u003C\u002Fcode>, benda mana yang sebenarnya kamu ubah?\u003C\u002Fstrong> Jawab itu dengan benar, dan ketiga lapis di atas berhenti jadi misteri.\u003C\u002Fp>\n\u003Ch2 id=\"pertanyaan-buat-kamu\">Pertanyaan buat kamu\u003C\u002Fh2>\n\u003Col>\n\u003Cli>Kalau \u003Ccode>pesanan_baru\u003C\u002Fcode> menerima list dari pemanggilnya, siapa yang seharusnya bertanggung jawab waktu list itu berubah setelahnya — yang mengirim, atau yang menerima?\u003C\u002Fli>\n\u003Cli>Lapis 2 dan lapis 3 kelihatan seperti dua bug yang beda. Tapi keduanya bisa diringkas jadi satu pertanyaan yang sama persis. Pertanyaan apa itu?\u003C\u002Fli>\n\u003Cli>Kalau \u003Ccode>TOTAL_KAS\u003C\u002Fcode> bukan angka melainkan dict, misalnya \u003Ccode>{&quot;kas&quot;: 0}\u003C\u002Fcode>, apakah lapis 3 masih perlu bilang ke Python bahwa nama itu milik modul? Coba di kertas dulu, baru di terminal.\u003C\u002Fli>\n\u003C\u002Fol>\n","\u003Cul>\n\u003Cli>Tiga lapis beda, satu tema: mana yang kamu ubah, dan benda apa itu sebenarnya.\u003C\u002Fli>\n\u003Cli>Nilai default sebuah fungsi dihitung sekali, jadi list di nilai default-nya dipakai bersama selamanya.\u003C\u002Fli>\n\u003Cli>Mengubah nama lokal nggak mengubah isi \u003Cem>dict\u003C\u002Fem> yang dipegang pemanggil.\u003C\u002Fli>\n\u003Cli>Nama yang diubah di dalam fungsi dianggap lokal, kecuali kamu bilang terus terang bahwa itu milik modul.\u003C\u002Fli>\n\u003Cli>Memperbaiki lapis 1 saja masih menyisakan 4 dari 6 merah.\u003C\u002Fli>\n\u003C\u002Ful>\n",[185,203,216,229,248,266],{"id":186,"title":187,"title_en":8,"slug":188,"excerpt":189,"excerpt_en":8,"has_translation":11,"published_at":190,"reading_time":191,"hidden_from_listing":11,"tags":192,"thumbnail_image":8,"og_image":194,"series":195,"authors":200},132,"Python Tuples: Why All Three Points Are the Same Point","python-tuples","Three points walk into a loop and come out identical. The list was never copied three times; the name was. A tuple makes that bug impossible.","2026-10-28T12:00:00.000Z",6,[81,193],"tuple","\u002Fog\u002Fpython-tuples.png",{"id":196,"title":197,"title_en":198,"slug":199},30,"Koleksi dan String","Collections and Strings","python-collections",[201],{"authors_id":202},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":8},{"id":204,"title":205,"title_en":8,"slug":206,"excerpt":207,"excerpt_en":8,"has_translation":11,"published_at":208,"reading_time":191,"hidden_from_listing":11,"tags":209,"thumbnail_image":8,"og_image":211,"series":212,"authors":213},131,"Python Sets: the Duplicate That Keeps Coming Back","python-sets","A de-duplication loop that works on clean data leaves four tags where there should be two. The bug is case, and the fix is a `set`.","2026-10-28T11:00:00.000Z",[81,210],"set","\u002Fog\u002Fpython-sets.png",{"id":196,"title":197,"title_en":198,"slug":199},[214],{"authors_id":215},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":8},{"id":217,"title":218,"title_en":8,"slug":219,"excerpt":220,"excerpt_en":8,"has_translation":11,"published_at":221,"reading_time":191,"hidden_from_listing":11,"tags":222,"thumbnail_image":8,"og_image":224,"series":225,"authors":226},130,"Python Dictionaries: the Key That Isn't There","python-dictionary","A word counter dies the first time it meets a word twice. The fix is one line; what takes longer is knowing which of a dict's three lookups to reach for.","2026-10-28T10:00:00.000Z",[81,223],"dictionary","\u002Fog\u002Fpython-dictionary.png",{"id":196,"title":197,"title_en":198,"slug":199},[227],{"authors_id":228},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":8},{"id":230,"title":231,"title_en":8,"slug":232,"excerpt":233,"excerpt_en":8,"has_translation":11,"published_at":234,"reading_time":13,"hidden_from_listing":11,"tags":235,"thumbnail_image":8,"og_image":242,"series":243,"authors":245},129,"Biar RAG nggak kena 504: pisahin jalur query dan ingestion","rag-pisah-jalur-query-dan-ingestion","Satu service RAG yang merangkap parsing dan menjawab kueri bakal tumbang pas ada yang upload PDF 200 halaman. Obatnya dua jalur dan satu queue.","2026-10-22T01:30:00.000Z",[236,237,238,239,240,241],"rag","cloud-run","cloud-tasks","gcp","serverless","arsitektur","\u002Fog\u002Frag-pisah-jalur-query-dan-ingestion.png",{"id":244,"title":32,"title_en":33,"slug":34},8,[246],{"authors_id":247},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":8},{"id":249,"title":250,"title_en":8,"slug":251,"excerpt":252,"excerpt_en":8,"has_translation":11,"published_at":253,"reading_time":191,"hidden_from_listing":11,"tags":254,"thumbnail_image":8,"og_image":261,"series":262,"authors":263},128,"Linear atau graf: cara mengatur banyak agent tanpa loop abadi","multi-agen-linear-atau-grafik","Satu agent dengan dua puluh tool gampang kacau. Begitu beberapa agent saling revisi, kamu butuh graf yang mendukung cycle dan angka yang membuatnya berhenti.","2026-10-21T16:05:00.000Z",[255,256,257,258,259,260],"multi-agent","langgraph","autogen","orkestrasi","checkpoint","llm","\u002Fog\u002Fmulti-agen-linear-atau-grafik.png",{"id":244,"title":32,"title_en":33,"slug":34},[264],{"authors_id":265},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":8},{"id":267,"title":268,"title_en":8,"slug":269,"excerpt":270,"excerpt_en":8,"has_translation":11,"published_at":271,"reading_time":191,"hidden_from_listing":11,"tags":272,"thumbnail_image":8,"og_image":278,"series":279,"authors":280},127,"Kenapa RAG yang cuma andalkan cosine similarity sering nyasar","kenapa-rag-cuma-cosine-similarity-sering-nyasar","RAG yang cuma andalkan embedding balikin chunk yang mirip maknanya, bukan yang kamu butuh. Ini penyebabnya, dan dua lapis penambalnya.","2026-10-19T02:04:06.718Z",[236,273,274,275,276,277],"vector-search","bm25","hybrid-search","retrieval","embedding","\u002Fog\u002Fkenapa-rag-cuma-cosine-similarity-sering-nyasar.png",{"id":244,"title":32,"title_en":33,"slug":34},[281],{"authors_id":282},{"id":107,"name":108,"slug":109,"role":110,"profile_picture":8},[284,288,291,294,297,300,303],{"text":285,"depth":286,"id":287},"Hasil pengukuran",2,"hasil-pengukuran",{"text":289,"depth":286,"id":290},"Lapis 1 — nilai default yang dihitung sekali","lapis-1-nilai-default-yang-dihitung-sekali",{"text":292,"depth":286,"id":293},"Lapis 2 — mengubah nama lokal, bukan nilai di dalam dict","lapis-2-mengubah-nama-lokal-bukan-nilai-di-dalam-dict",{"text":295,"depth":286,"id":296},"Lapis 3 — nama milik modul, atau nama milik fungsi","lapis-3-nama-milik-modul-atau-nama-milik-fungsi",{"text":298,"depth":286,"id":299},"Jebakan yang gampang kejeblos","jebakan-yang-gampang-kejeblos",{"text":301,"depth":286,"id":302},"Setelah ketiganya beres","setelah-ketiganya-beres",{"text":304,"depth":286,"id":305},"Pertanyaan buat kamu","pertanyaan-buat-kamu",1793246467029]