Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapakah `counter = 1` Di Dalam Penutupan Menyebabkan `UnboundLocalError` dalam Python?

Mengapakah `counter = 1` Di Dalam Penutupan Menyebabkan `UnboundLocalError` dalam Python?

Mary-Kate Olsen
Lepaskan: 2024-12-26 18:09:10
asal
796 orang telah melayarinya

Why Does `counter  = 1` Inside a Closure Cause an `UnboundLocalError` in Python?

Memahami Ralat Pembolehubah Setempat Tidak Terikat dalam Penutupan

Apabila menulis kod menggunakan penutupan, adalah penting untuk mempertimbangkan skop pembolehubah. Dalam kes ini, persoalan timbul tentang mengapa UnboundLocalError berlaku dalam kod berikut:

counter = 0

def increment():
  counter += 1

increment()
Salin selepas log masuk

Untuk menjawab soalan ini, kita mesti terlebih dahulu memahami konsep penutupan dalam Python. Penutupan ialah fungsi yang mengekalkan akses kepada pembolehubah yang ditakrifkan dalam skop yang ditakrifkan, walaupun selepas skop telah dikeluarkan. Dalam kes ini, pembolehubah pembilang ditakrifkan dalam skop global dan dirujuk dalam fungsi increment(), yang dianggap sebagai penutupan.

Walau bagaimanapun, dalam Python, pembolehubah dalam fungsi dianggap secara automatik sebagai pembolehubah tempatan melainkan dinyatakan sebaliknya secara jelas. Apabila pembilang baris = 1 dilaksanakan dalam increment(), penterjemah cuba untuk menambah pembolehubah pembilang tempatan. Walau bagaimanapun, oleh kerana tiada nilai telah ditetapkan untuk membalas dalam fungsi increment(), ia kekal tidak terikat. Ini mengakibatkan UnboundLocalError dibangkitkan.

Untuk menyelesaikan isu ini, terdapat dua pendekatan utama:

  1. Menggunakan Kata Kunci global: Jika niatnya adalah untuk pembilang untuk menjadi pembolehubah global, kata kunci global boleh digunakan dalam fungsi increment() untuk mengisytiharkan secara eksplisit bahawa pembilang harus merujuk pembolehubah global dan bukannya pembolehubah tempatan dengan nama yang sama.
counter = 0

def increment():
  global counter
  counter += 1

increment()
Salin selepas log masuk
  1. Menggunakan bukan tempatan (Python 3.x sahaja): Dalam Python 3.x, kata kunci bukan tempatan boleh digunakan dalam fungsi bersarang untuk mengisytiharkan bahawa pembolehubah harus dianggap sebagai bukan tempatan, bermakna ia boleh mengakses pembolehubah dengan nama yang sama dalam lampiran skop.
counter = 0

def increment():
  nonlocal counter
  counter += 1

increment()
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah `counter = 1` Di Dalam Penutupan Menyebabkan `UnboundLocalError` dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan