[{"data":1,"prerenderedAt":186},["ShallowReactive",2],{"site-header":3,"site-footer-license":42,"article-jawaban-nilai-default-cuma-dibuat-sekali-with-latest":46},{"navigations":4},[5,20,37],{"collection":6,"item":7},"series",{"__typename":6,"title":8,"slug":9,"children_series":10},"Artikel","all",[11,14,17],{"title":12,"slug":13},"Algoritma dan Struktur Data","algoritma-struktur-data",{"title":15,"slug":16},"Kecerdasan Artifisial","kecerdasan-artifisial",{"title":18,"slug":19},"Konsep Dasar Pemrograman","konsep-dasar-pemrograman",{"collection":6,"item":21},{"__typename":6,"title":22,"slug":23,"children_series":24},"Tutorial","tutorial",[25,28,31,34],{"title":26,"slug":27},"Belajar Java","belajar-java",{"title":29,"slug":30},"Belajar Pascal","belajar-pascal",{"title":32,"slug":33},"Belajar Golang","belajar-golang",{"title":35,"slug":36},"Belajar Python","belajar-python",{"collection":6,"item":38},{"__typename":6,"title":39,"slug":40,"children_series":41},"Lab","lab",[],{"name":43,"url":44,"show":45},"CC BY-SA","https://creativecommons.org/licenses/by-sa/4.0/",false,{"article":47,"renderedBody":110,"renderedTakeaway":111,"latestArticles":112,"toc":163},{"prerequisite":48,"id":52,"title":53,"slug":54,"excerpt":55,"published_at":56,"thumbnail_image":57,"tags":58,"reading_time":62,"takeway":63,"body":64,"authors":65,"series":71},{"id":49,"title":50,"slug":51},"120","Tiap Nota di Kafe Ini Isinya Pesanan yang Sama","tiap-nota-isinya-pesanan-yang-sama","121","Jawabannya: Nilai Default Itu Cuma Dibuat Sekali","jawaban-nilai-default-cuma-dibuat-sekali","Tiga gejala yang kelihatan seperti satu penyakit, padahal tiga lapis beda dengan obat masing-masing. Ini urutan perbaikannya.","2026-10-11T23:00:15.000Z",null,[59,60,61,40],"python","scope","mutasi",4,"- 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.","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.",[66],{"authors_id":67},{"name":68,"slug":69,"role":70,"profile_picture":57},"Daffa Izzuddin","izzudd","Writer",{"id":72,"title":39,"slug":40,"articles":73,"parent_series":57},"29",[74,83,92,99,102],{"id":75,"title":76,"slug":77,"excerpt":78,"thumbnail_image":57,"tags":79},"104","Query-nya Tinggal 2, Tapi Response-nya Masih 1 Detik","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.",[80,81,82],"database","performance","backend",{"id":84,"title":85,"slug":86,"excerpt":87,"thumbnail_image":57,"tags":88},"114","Saldo Naik Empat Kali untuk Satu Pembayaran","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.",[89,90,91,80,40],"idempotency","webhook","postgres",{"id":93,"title":94,"slug":95,"excerpt":96,"thumbnail_image":57,"tags":97},"116","Webhook-nya Telat, Job Rekonsiliasinya Keburu Jalan","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.",[89,98,90,91,40],"reconciliation",{"id":49,"title":50,"slug":51,"excerpt":100,"thumbnail_image":57,"tags":101},"Nota tiap meja isinya sama semua, dan totalnya Rp0 — padahal tiap meja cuma pesan satu barang. Coba tebak kenapa.",[59,60,61,40],{"id":103,"title":104,"slug":105,"excerpt":106,"thumbnail_image":57,"tags":107},"122","Script yang Nggak Bisa Bilang di Mana Salahnya","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.",[59,108,109,40],"error-handling","validasi","\u003Cp>Yang menarik dari lab ini bukan satu jawabannya, tapi \u003Cstrong>kenapa ada tiga\u003C/strong>. 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/p>\n\u003Cp>Temanya cuma satu, dan ini yang paling layak dibawa pulang: \u003Cstrong>mana yang kamu ubah, dan benda apa itu sebenarnya.\u003C/strong> Tiap lapis rusak karena penulisnya mengira dia mengubah satu benda, padahal yang dia ubah benda lain — atau nggak mengubah apa pun.\u003C/p>\n\u003Ch2 id=\"hasil-pengukuran\">Hasil pengukuran\u003C/h2>\n\u003Cp>Pemeriksaannya enam. Angka di kolom kanan: berapa yang masih merah.\u003C/p>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>varian\u003C/th>\n\u003Cth>merah\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>kondisi awal\u003C/td>\n\u003Ctd>\u003Cstrong>6 dari 6\u003C/strong>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>cuma memperbaiki lapis 1\u003C/td>\n\u003Ctd>\u003Cstrong>4 dari 6\u003C/strong>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>ketiga lapis sekaligus\u003C/td>\n\u003Ctd>\u003Cstrong>0 dari 6\u003C/strong> (hijau)\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\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/p>\n\u003Ch2 id=\"lapis-1-nilai-default-yang-dihitung-sekali\">Lapis 1 — \u003Cem>nilai default\u003C/em> yang dihitung sekali\u003C/h2>\n\u003Cp>Ini lapis yang paling dikenal orang.\u003C/p>\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/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C/span>\n    \u003C/div>\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/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\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/span>\u003Cspan style=\"color:#B392F0\"> pesanan_baru\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(meja, item\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[]):   \u003C/span>\u003Cspan style=\"color:#6A737D\"># salah\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Kelihatannya wajar: &quot;kalau pemanggil nggak mengirim item, bikin \u003Cem>list\u003C/em> kosong baru.&quot; Yang nggak kelihatan: \u003Cstrong>nilai default sebuah fungsi dihitung sekali\u003C/strong>, waktu fungsinya baru didefinisikan di memori, bukan tiap kali dipanggil. Jadi \u003Ccode>[]\u003C/code> di situ bukan list kosong baru setiap panggilan — dia satu \u003Cem>list\u003C/em> yang sama, dipakai ulang selamanya. Semua nota berbagi \u003Cem>list\u003C/em> itu.\u003C/p>\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/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C/span>\n    \u003C/div>\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/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\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/span>\u003Cspan style=\"color:#B392F0\"> pesanan_baru\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(meja, item\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\">None\u003C/span>\u003Cspan style=\"color:#E1E4E8\">):   \u003C/span>\u003Cspan style=\"color:#6A737D\"># benar\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> item \u003C/span>\u003Cspan style=\"color:#F97583\">is\u003C/span>\u003Cspan style=\"color:#79B8FF\"> None\u003C/span>\u003Cspan style=\"color:#E1E4E8\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        item \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> []\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"meja\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: meja, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"item\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: item, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"total\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Kamu nggak perlu percaya kata orang; cek sendiri:\u003C/p>\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/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C/span>\n    \u003C/div>\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/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\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/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"item\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">is\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> kasir.pesanan_baru(\u003C/span>\u003Cspan style=\"color:#79B8FF\">2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"item\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]   \u003C/span>\u003Cspan style=\"color:#6A737D\"># harus False\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Bahkan buktinya nggak perlu ditakar: \u003Ccode>pesanan_baru.__defaults__\u003C/code> menyimpan list itu secara harfiah. Isi satu nota, lalu lihat \u003Ccode>__defaults__\u003C/code> — item yang baru kamu masukkan muncul di situ juga, karena \u003Ccode>pesanan[&quot;item&quot;]\u003C/code> dan \u003Cem>nilai default\u003C/em> itu \u003Cstrong>benda yang sama\u003C/strong>. Perhatikan juga: \u003Ccode>pesanan_baru\u003C/code> 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/p>\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/em>\u003C/h2>\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/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C/span>\n    \u003C/div>\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/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\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/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> pesanan[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"total\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]        \u003C/span>\u003Cspan style=\"color:#6A737D\"># menyalin NILAI\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">total \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> total \u003C/span>\u003Cspan style=\"color:#F97583\">+\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> harga \u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> qty     \u003C/span>\u003Cspan style=\"color:#6A737D\"># cuma nama lokal yang berubah\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> pesanan                  \u003C/span>\u003Cspan style=\"color:#6A737D\"># nota nggak pernah tahu\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>\u003Ccode>total = pesanan[&quot;total&quot;]\u003C/code> bikin nama baru \u003Ccode>total\u003C/code> yang menunjuk ke angka yang sama. Baris berikutnya mengubah angka di nama itu — tapi \u003Ccode>pesanan\u003C/code> masih memegang angka lama. Nama lokal mati begitu fungsinya selesai.\u003C/p>\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/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C/span>\n    \u003C/div>\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/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\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/span>\u003Cspan style=\"color:#9ECBFF\">\"total\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> pesanan[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"total\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">+\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> harga \u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> qty   \u003C/span>\u003Cspan style=\"color:#6A737D\"># benar\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Bedanya halus, tapi ini intinya: yang diubah adalah \u003Cstrong>isi \u003Cem>dict\u003C/em> yang dipegang pemanggil\u003C/strong>. Mengubah nama variabel belum tentu mengubah benda yang kamu maksud — nama yang sama di dua tempat bukan jaminan benda yang sama.\u003C/p>\n\u003Ch2 id=\"lapis-3-nama-milik-modul-atau-nama-milik-fungsi\">Lapis 3 — nama milik modul, atau nama milik fungsi\u003C/h2>\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/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C/span>\n    \u003C/div>\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/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\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/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C/span>\u003Cspan style=\"color:#B392F0\"> catat_penjualan\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(jumlah):\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    total \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\"> TOTAL_KAS\u003C/span>\u003Cspan style=\"color:#6A737D\">        # bikin nama lokal baru\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    total \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> total \u003C/span>\u003Cspan style=\"color:#F97583\">+\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> jumlah   \u003C/span>\u003Cspan style=\"color:#6A737D\"># cuma lokalnya yang berubah\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> total             \u003C/span>\u003Cspan style=\"color:#6A737D\"># TOTAL_KAS nggak pernah tersentuh\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Penulis aslinya berhenti di tengah jalan: niatnya menambah ke \u003Ccode>TOTAL_KAS\u003C/code>, tapi menulisnya lewat variabel lain. Akibatnya \u003Ccode>TOTAL_KAS\u003C/code> tetap nol sampai kapan pun. Kalau dia menulisnya langsung tanpa bilang ke Python bahwa nama itu milik modul:\u003C/p>\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/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C/span>\n    \u003C/div>\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/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\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/span>\u003Cspan style=\"color:#B392F0\"> catat_penjualan\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(jumlah):\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    TOTAL_KAS\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#79B8FF\"> TOTAL_KAS\u003C/span>\u003Cspan style=\"color:#F97583\"> +\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> jumlah   \u003C/span>\u003Cspan style=\"color:#6A737D\"># UnboundLocalError\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Python malah melempar \u003Ccode>UnboundLocalError\u003C/code>. Sebabnya: begitu ada penugasan ke sebuah nama di dalam fungsi, Python menganggap nama itu \u003Cstrong>lokal\u003C/strong> untuk seluruh fungsi tersebut. Waktu dia membaca \u003Ccode>TOTAL_KAS\u003C/code> 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/p>\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/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PYTHON\u003C/span>\n    \u003C/div>\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/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\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/span>\u003Cspan style=\"color:#B392F0\"> catat_penjualan\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(jumlah):\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    global\u003C/span>\u003Cspan style=\"color:#79B8FF\"> TOTAL_KAS\u003C/span>\u003Cspan style=\"color:#6A737D\">                 # benar\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    TOTAL_KAS\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#79B8FF\"> TOTAL_KAS\u003C/span>\u003Cspan style=\"color:#F97583\"> +\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> jumlah\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#79B8FF\"> TOTAL_KAS\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>\u003Ccode>global\u003C/code> bilang ke Python: nama \u003Ccode>TOTAL_KAS\u003C/code> di sini menunjuk yang di tingkat modul, bukan bikin yang baru di sini.\u003C/p>\n\u003Ch2 id=\"jebakan-yang-gampang-kejeblos\">Jebakan yang gampang kejeblos\u003C/h2>\n\u003Cp>\u003Cstrong>\u003Ccode>item or []\u003C/code> sebagai ganti \u003Ccode>if item is None\u003C/code>.\u003C/strong> Kelihatan lebih ringkas dan di demo ini tetap benar — tapi salah begitu ada pemanggil yang sengaja mengirim \u003Cem>list\u003C/em> kosong sebagai \u003Cem>argumen\u003C/em>, karena \u003Ccode>item or []\u003C/code> menggantinya dengan \u003Cem>list\u003C/em> baru, padahal pemanggil mau mengisi list yang dia kirim.\u003C/p>\n\u003Cp>\u003Cstrong>Nambah \u003Ccode>.copy()\u003C/code> di mana-mana\u003C/strong> biar nggak ada yang saling nimpa. \u003Ccode>.copy()\u003C/code> 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/p>\n\u003Cp>\u003Cstrong>Ganti nama variabel biar &quot;beda&quot;.\u003C/strong> Kalau \u003Ccode>total\u003C/code> diganti jadi \u003Ccode>total_nota\u003C/code>, 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/em>.\u003C/p>\n\u003Ch2 id=\"setelah-ketiganya-beres\">Setelah ketiganya beres\u003C/h2>\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/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">BASH\u003C/span>\n    \u003C/div>\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/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\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/span>\u003Cspan style=\"color:#9ECBFF\"> check\u003C/span>\u003Cspan style=\"color:#6A737D\">    # harus 6 dari 6 LULUS\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">make\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> demo\u003C/span>\u003Cspan style=\"color:#6A737D\">     # tiga meja, tiga nota, sesuai pesanannya\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Di situ \u003Ccode>make demo\u003C/code> 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/p>\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/code>, benda mana yang sebenarnya kamu ubah?\u003C/strong> Jawab itu dengan benar, dan ketiga lapis di atas berhenti jadi misteri.\u003C/p>\n\u003Ch2 id=\"pertanyaan-buat-kamu\">Pertanyaan buat kamu\u003C/h2>\n\u003Col>\n\u003Cli>Kalau \u003Ccode>pesanan_baru\u003C/code> menerima list dari pemanggilnya, siapa yang seharusnya bertanggung jawab waktu list itu berubah setelahnya — yang mengirim, atau yang menerima?\u003C/li>\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/li>\n\u003Cli>Kalau \u003Ccode>TOTAL_KAS\u003C/code> bukan angka melainkan dict, misalnya \u003Ccode>{&quot;kas&quot;: 0}\u003C/code>, apakah lapis 3 masih perlu bilang ke Python bahwa nama itu milik modul? Coba di kertas dulu, baru di terminal.\u003C/li>\n\u003C/ol>\n","\u003Cul>\n\u003Cli>Tiga lapis beda, satu tema: mana yang kamu ubah, dan benda apa itu sebenarnya.\u003C/li>\n\u003Cli>Nilai default sebuah fungsi dihitung sekali, jadi list di nilai default-nya dipakai bersama selamanya.\u003C/li>\n\u003Cli>Mengubah nama lokal nggak mengubah isi \u003Cem>dict\u003C/em> yang dipegang pemanggil.\u003C/li>\n\u003Cli>Nama yang diubah di dalam fungsi dianggap lokal, kecuali kamu bilang terus terang bahwa itu milik modul.\u003C/li>\n\u003Cli>Memperbaiki lapis 1 saja masih menyisakan 4 dari 6 merah.\u003C/li>\n\u003C/ul>\n",[113,124,134,143,152,161],{"id":114,"title":115,"slug":116,"excerpt":117,"thumbnail_image":57,"tags":118},"111","Rust Masuk Kernel Linux: Revolusi Nyata atau Cuma Euforia RIIR?","rust-di-kernel-linux-revolusi-atau-cuma-hype","Selama lebih dari 30 tahun kernel Linux cuma mau bahasa C, lalu tiba-tiba Rust resmi masuk di Linux 6.1. Itu revolusi beneran atau cuma kebawa euforia meme Rewrite It In Rust? Yuk lihat datanya, bukan cuma opininya.",[119,120,121,122,123],"rust","linux","kernel","system-programming","memory-safety",{"id":125,"title":126,"slug":127,"excerpt":128,"thumbnail_image":57,"tags":129},"118","Belajar Idempotency dari Stok yang Keburu Kebeli","pub-sub-sendiri-lalu-belajar-idempotency","Tugas pertama saya di kerjaan pertama: sistem yang kewalahan menerima webhook. Saya putuskan membangun pub/sub sendiri dari nol, dan pelajaran yang akhirnya datang bukan dari situ — tapi dari stok gudang yang keburu kebeli orang.",[89,130,131,132,133],"event-driven","celery","rabbitmq","post-mortem",{"id":135,"title":136,"slug":137,"excerpt":138,"thumbnail_image":57,"tags":139},"112","Aplikasimu lambat, dan kamu udah kepikiran ganti bahasa. Tunggu dulu","aplikasimu-lambat-dan-kamu-udah-kepikiran-ganti-bahasa-tunggu-dulu","Ada endpoint yang grafiknya spike tiap beberapa menit, dan kepikiran buat pindah dari Go ke Rust? Discord dan Cloudflare beneran melakukannya — tapi cuma setelah kehabisan cara lain dan punya datanya. Yuk, bedah gejala mana yang beneran butuh rewrite, dan mana yang cuma butuh profiling. 🤔",[82,81,140,119,141,142],"golang","system-design","profiling",{"id":144,"title":145,"slug":146,"excerpt":147,"thumbnail_image":57,"tags":148},"113","Garbage Collector dituduh bikin aplikasi lemot. Seberapa adil tuduhan itu?","garbage-collector-dituduh-bikin-aplikasi-lemot","GC sering jadi tersangka utama tiap aplikasi melambat, dan banyak yang percaya dia jalan pakai timer tiap beberapa detik. Dua-duanya nggak sepenuhnya benar. Yuk bedah cara kerja GC dari dalam, plus satu pengecualian yang bikin Discord kesakitan tiap 2 menit. 🤔",[82,81,140,149,150,151],"jvm","garbage-collector","memory",{"id":153,"title":154,"slug":155,"excerpt":156,"thumbnail_image":57,"tags":157},"119","Aturan Sintaks: Satu Titik Koma Bikin Program Nggak Jalan","aturan-sintaks-pemrograman","Baru nulis beberapa baris, programnya udah nolak jalan? Seringnya bukan logikanya yang salah, cuma satu karakter yang kurang atau salah tempat.",[158,159,160,59],"syntax","dasar","konsep",{"id":49,"title":50,"slug":51,"excerpt":100,"thumbnail_image":57,"tags":162},[59,60,61,40],[164,168,171,174,177,180,183],{"text":165,"depth":166,"id":167},"Hasil pengukuran",2,"hasil-pengukuran",{"text":169,"depth":166,"id":170},"Lapis 1 — nilai default yang dihitung sekali","lapis-1-nilai-default-yang-dihitung-sekali",{"text":172,"depth":166,"id":173},"Lapis 2 — mengubah nama lokal, bukan nilai di dalam dict","lapis-2-mengubah-nama-lokal-bukan-nilai-di-dalam-dict",{"text":175,"depth":166,"id":176},"Lapis 3 — nama milik modul, atau nama milik fungsi","lapis-3-nama-milik-modul-atau-nama-milik-fungsi",{"text":178,"depth":166,"id":179},"Jebakan yang gampang kejeblos","jebakan-yang-gampang-kejeblos",{"text":181,"depth":166,"id":182},"Setelah ketiganya beres","setelah-ketiganya-beres",{"text":184,"depth":166,"id":185},"Pertanyaan buat kamu","pertanyaan-buat-kamu",1791759826587]