0Pricing
Python Academy · Pelajaran

nonlocal dan Keadaan yang Dapat Diubah

Ubah scope yang melingkupinya

nonlocal dan Keadaan yang Dapat Diubah adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.

Membaca dan menulis variabel dalam cakupan pembungkus

Fungsi inner dapat dengan bebas membaca variabel pembungkus, tetapi jika mencoba menetapkan nama tersebut, Python menganggapnya sebagai variabel lokal baru. Hal ini sering mengejutkan para pemula.

def outer():
    count = 0
    def inner():
        return count
    return inner()
print(outer())

Jebakan penetapan

Menetapkan nama pembungkus tanpa menyatakan maksud membuat nama tersebut menjadi lokal, sehingga variabel outer tidak pernah diperbarui. Di sini, perubahan tersebut hilang.

def outer():
    count = 0
    def bump():
        count = count + 1
    try:
        bump()
    except UnboundLocalError as e:
        print('Error:', e)
outer()

Kata kunci nonlocal

nonlocal menyatakan bahwa suatu nama merujuk ke variabel dalam cakupan fungsi pembungkus terdekat, sehingga penetapan memperbarui variabel outer alih-alih membuat variabel lokal.

def outer():
    count = 0
    def bump():
        nonlocal count
        count += 1
    bump()
    bump()
    return count
print(outer())

Penutupan penghitung

Dengan nonlocal, Anda dapat membangun penghitung yang menyimpan status. Setiap pemanggilan mengubah variabel yang ditangkap dan mengingat kemajuannya.

def make_counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment
c = make_counter()
print(c())
print(c())
print(c())

Penghitung yang berdiri sendiri

Setiap penghitung menyimpan statusnya sendiri karena setiap penutupan menangkap variabel yang terpisah.

def make_counter():
    count = 0
    def inc():
        nonlocal count
        count += 1
        return count
    return inc
a = make_counter()
b = make_counter()
print(a(), a(), b())

nonlocal dibandingkan dengan global

nonlocal menargetkan cakupan fungsi pembungkus, sedangkan global menargetkan tingkat modul. Gunakan nonlocal untuk penutupan dan global untuk status yang mencakup seluruh modul.

total = 0
def add_global(n):
    global total
    total += n
add_global(5)
add_global(3)
print(total)

Status yang dapat diubah tanpa nonlocal

Jika nilai pembungkus adalah objek yang dapat diubah, seperti daftar atau kamus, Anda dapat mengubahnya langsung tanpa nonlocal karena Anda tidak menetapkan ulang namanya.

def make_logger():
    history = []
    def log(msg):
        history.append(msg)
        return history
    return log
log = make_logger()
log('start')
print(log('stop'))

Akumulator

Menggabungkan nonlocal dengan penutupan menghasilkan akumulator berjalan yang menambahkan setiap nilai ke total yang diingat.

def make_accumulator():
    total = 0
    def add(n):
        nonlocal total
        total += n
        return total
    return add
acc = make_accumulator()
print(acc(10))
print(acc(5))
print(acc(100))

toggle sederhana

nonlocal memudahkan pembalikan status boolean di antara pemanggilan.

def make_toggle():
    on = False
    def toggle():
        nonlocal on
        on = not on
        return on
    return toggle
t = make_toggle()
print(t(), t(), t())

Mengatur ulang status

Anda dapat menyediakan beberapa fungsi inner yang berbagi status pembungkus yang sama, misalnya satu fungsi untuk add dan satu untuk reset.

def make_bank():
    balance = 0
    def deposit(n):
        nonlocal balance
        balance += n
        return balance
    def reset():
        nonlocal balance
        balance = 0
        return balance
    return deposit, reset
deposit, reset = make_bank()
print(deposit(50))
print(reset())

nonlocal memerlukan variabel yang sudah ada

nonlocal mengharuskan nama tersebut sudah ada dalam cakupan pembungkus; jika tidak, Python akan memunculkan SyntaxError saat definisi. Kata kunci ini tidak dapat membuat variabel outer baru.

def outer():
    value = 'set'
    def inner():
        nonlocal value
        value = 'changed'
    inner()
    return value
print(outer())

Pemeriksaan Singkat

Di dalam fungsi bersarang, Anda ingin menetapkan ulang variabel dari fungsi pembungkus. Kata kunci apa yang digunakan?

Ringkasan: nonlocal dan Status yang Dapat Diubah

Ringkasan:

  • Menetapkan nama pembungkus biasanya membuat variabel lokal baru; nonlocal mencegahnya.
  • nonlocal menargetkan cakupan fungsi pembungkus; global menargetkan modul.
  • Mengubah objek yang dapat diubah secara langsung tidak memerlukan deklarasi.
  • Penutupan dengan nonlocal dapat membangun penghitung, akumulator, dan toggle yang mengingat status.
def make_counter():
    n = 0
    def inc():
        nonlocal n
        n += 1
        return n
    return inc
c = make_counter()
print(c(), c())

Pertanyaan yang Sering Diajukan

Apakah pelajaran “nonlocal dan Keadaan yang Dapat Diubah” gratis?

Ya — teks lengkap “nonlocal dan Keadaan yang Dapat Diubah” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “nonlocal dan Keadaan yang Dapat Diubah”?

Ubah scope yang melingkupinya Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Python Academy?

Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “nonlocal dan Keadaan yang Dapat Diubah” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Fungsi Kelas Utama
  2. Closure dan Variabel Bebas
  3. nonlocal dan Keadaan yang Dapat Diubah
  4. Fungsi Parsial
← Kembali ke Python Academy