Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Menyelesaikan UnboundLocalError dalam Skop Fungsi Bersarang dalam Python?

Bagaimana untuk Menyelesaikan UnboundLocalError dalam Skop Fungsi Bersarang dalam Python?

Susan Sarandon
Susan Sarandonasal
2024-10-21 18:45:021085semak imbas

How to Resolve UnboundLocalError in Nested Function Scopes in Python?

UnboundLocalError dalam Skop Fungsi Bersarang

Dalam Python, mengakses pembolehubah yang ditakrifkan dalam fungsi luar daripada fungsi bersarang kadangkala boleh menghasilkan UnboundLocalError. Pertimbangkan contoh berikut:

<code class="python">def outer():
    ctr = 0

    def inner():
        ctr += 1

    inner()</code>

Menjalankan kod ini akan menimbulkan UnboundLocalError untuk pembolehubah ctr dalam fungsi dalam. Ralat ini berlaku kerana Python menganggap ctr sebagai pembolehubah tempatan dalam fungsi dalaman, walaupun ia ditakrifkan dalam fungsi luar. Untuk menyelesaikan isu ini, kita perlu menggunakan mekanisme yang membenarkan fungsi dalaman mengakses skop fungsi luar.

Penyelesaian:

Python 3 memperkenalkan pernyataan bukan tempatan, yang membenarkan pengubahsuaian pembolehubah bukan tempatan. Dengan menambahkan bukan tempatan pada fungsi dalam, kami secara eksplisit mengisytiharkan ctr sebagai pembolehubah bukan setempat, membenarkan penjilidannya semula dalam fungsi dalam.

<code class="python">def outer():
    ctr = 0

    def inner():
        nonlocal ctr
        ctr += 1

    inner()</code>

Sebagai alternatif, dalam Python 2, yang tidak mempunyai bukan tempatan pernyataan, kita boleh menyelesaikan isu ini dengan melampirkan pemboleh ubah pembilang dalam senarai atau struktur data lain untuk mengelakkan nama kosong diikat semula:

<code class="python">ctr = [0]

def inner():
    ctr[0] += 1</code>

Pendekatan ini mengekalkan nilai ctr dalam senarai ctr, menghalang UnboundLocalError daripada berlaku.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan UnboundLocalError dalam Skop Fungsi Bersarang dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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