Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Python 3 Menyenaraikan Pemahaman Tidak Boleh Mengakses Terus Pembolehubah Kelas?

Mengapa Python 3 Menyenaraikan Pemahaman Tidak Boleh Mengakses Terus Pembolehubah Kelas?

Linda Hamilton
Linda Hamiltonasal
2024-12-23 22:51:10859semak imbas

Why Can't Python 3 List Comprehensions Directly Access Class Variables?

Mengakses Pembolehubah Kelas daripada Pemahaman Senarai

Dalam Python 3, pemahaman senarai tidak boleh mengakses pembolehubah kelas secara langsung yang ditakrifkan dalam definisi kelas, kerana ia beroperasi dalam skop bersarangnya sendiri. Tingkah laku ini berbeza daripada Python 2, di mana akses sedemikian mungkin.

Contoh Ralat

Kod berikut menunjukkan isu dalam Python 3:

class Foo:
    x = 5
    y = [x for i in range(1)]

Kod ini akan menimbulkan NameError untuk x, kerana kefahaman senarai tidak boleh mengakses pembolehubah kelas.

Skop Kelas dan Senarai/Set/Dict Comprehension

Senarai, set dan pemahaman kamus, serta ungkapan penjana, beroperasi dalam skop bersarang yang tidak diwarisi daripada skop kelas. Ini kerana pemahaman tersebut dilaksanakan sebagai fungsi dan dijalankan dalam skop yang berasingan.

Penyelesaian

Walaupun terdapat sekatan, terdapat penyelesaian untuk mengakses pembolehubah kelas daripada pemahaman:

1 . Skop Eksplisit

Buat skop khusus dalam definisi kelas untuk memegang pembolehubah yang diperlukan oleh pemahaman:

class Foo:
    x = 5
    def __init__(self):
        y = [self.x for i in range(1)]

2. Pembolehubah Instance

Gunakan pembolehubah contoh sebaliknya, dengan memulakannya dalam pembina:

class Foo:
    def __init__(self):
        self.x = 5
        self.y = [self.x for i in range(1)]

3. Skop Global

Jika boleh, alihkan pembolehubah dan logik di luar definisi kelas dan gunakan skop global:

x = 5

class Foo:
    y = [x for i in range(1)]

Pengecualian: Terluar Boleh Berubah

Semasa mengakses pembolehubah kelas secara terus dalam pemahaman tidak mungkin, terdapat pengecualian untuk yang boleh lelar paling luar. Ungkapan yang menentukan paling luar boleh lelar boleh mengakses pembolehubah kelas:

class Foo:
    x = 5
    y = [i for i in range(x)]

Atas ialah kandungan terperinci Mengapa Python 3 Menyenaraikan Pemahaman Tidak Boleh Mengakses Terus Pembolehubah Kelas?. 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