UnboundLocalError: Tugasan Pembolehubah Pramatang dalam Blok Bersarang
Apabila bekerja dengan skop fungsi bersarang, seperti dalam kod yang disediakan, Python boleh menghadapi ralat mesej "UnboundLocalError: pembolehubah tempatan 'c' dirujuk sebelum tugasan." Ralat ini berlaku apabila pembolehubah yang ditetapkan dalam blok bersarang dirujuk sebelum ia dimulakan.
Dalam kod contoh:
a, b, c = (1, 2, 3) def test(): print(a) print(b) c += 1 # UnboundLocalError here
Kod cuba mencetak pembolehubah a, b dan c dalam ujian fungsi(). Walaupun a dan b adalah pembolehubah global dan boleh diakses secara langsung, c wujud dalam skop setempat fungsi. Akibatnya, tugasan c = 1 mencipta pembolehubah tempatan c yang mengatasi pembolehubah global dengan nama yang sama.
Apabila kod dilaksanakan, Python memulakan a dan b dan meneruskan panggilan test(). Dalam test(), ia mencetak a dan b dengan jayanya, tetapi cuba mencetak pembolehubah tempatan c sebelum ia diberikan sebarang nilai, yang membawa kepada ralat.
Untuk menyelesaikan isu ini, seseorang mesti mengisytiharkan pembolehubah secara eksplisit sebagai global dalam fungsi menggunakan kata kunci global sebelum memberikan sebarang nilai. Ini memberitahu Python untuk menggunakan pembolehubah global dan bukannya mencipta pembolehubah tempatan. Kod yang diperbetulkan ialah:
a, b, c = (1, 2, 3) def test(): global c # Declare 'c' as global print(a) print(b) c += 1
Sebagai alternatif, dalam Python 3, seseorang boleh menggunakan kata kunci bukan tempatan, yang merujuk kepada skop fungsi penutup terdekat yang mempunyai pembolehubah dengan nama yang sama. Ini membolehkan seseorang mengubah suai pembolehubah bukan global yang diisytiharkan dalam fungsi luar. Kod yang dikemas kini menggunakan bukan tempatan ialah:
a, b, c = (1, 2, 3) def test(): nonlocal c print(a) print(b) c += 1
Atas ialah kandungan terperinci Mengapa Python Membuang `UnboundLocalError` dalam Fungsi Bersarang, dan Bagaimana Ia Boleh Diselesaikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!