Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Saya Tidak Boleh Mengakses Pembolehubah Kelas Terus daripada Pemahaman Senarai dalam Python 3?

Mengapa Saya Tidak Boleh Mengakses Pembolehubah Kelas Terus daripada Pemahaman Senarai dalam Python 3?

Patricia Arquette
Patricia Arquetteasal
2024-12-18 09:09:10169semak imbas

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

Mengakses Pembolehubah Kelas daripada Pemahaman Senarai dalam Definisi Kelas

Dalam Python 2, mengakses pembolehubah kelas daripada pemahaman senarai dalam definisi kelas adalah mungkin. Walau bagaimanapun, dalam Python 3 dan ke atas, ini tidak dibenarkan kerana sekatan skop. Skop kelas dilayan secara berasingan daripada skop pemahaman dan fungsi lain, dan akibatnya, mengakses pembolehubah kelas dari dalam pemahaman menggunakan nama adalah tidak dibenarkan.

Sebagai contoh, kod berikut dalam Python 2 akan berfungsi :

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

Walau bagaimanapun, dalam Python 3, ia akan menghasilkan ralat:

NameError: name 'x' is not defined

Mengapa dan Bagaimana Sekatan Skop Berfungsi

Sebab sekatan ini adalah disebabkan oleh cara Python mengendalikan skop. Apabila menilai pemahaman senarai dalam definisi kelas, Python mencipta skop baharu untuk pemahaman itu. Skop baharu ini tidak termasuk skop kelas, jadi sebarang pembolehubah yang ditakrifkan dalam skop kelas tidak boleh dilihat dalam pemahaman.

Kefahaman, ungkapan penjana dan fungsi lambda semuanya mempunyai skop terpencilnya sendiri, yang bermaksud ia tidak boleh capai pembolehubah daripada fungsi lampiran atau skop kelas secara langsung. Ini ialah langkah keselamatan yang menghalang pengubahsuaian yang tidak diingini dalam skop yang disertakan.

Penyelesaian

Terdapat beberapa penyelesaian untuk sekatan ini:

  1. Gunakan Fungsi Sementara: Anda boleh mentakrifkan fungsi dalam kelas secara eksplisit melepasi pembolehubah kelas kepada kefahaman:
class Foo:
    x = 5

    def get_y(self, x):
        return [x for i in range(1)]

    y = get_y(x)
  1. Gunakan Nonlocal: Kata kunci ini boleh digunakan untuk mengarahkan fungsi dalam skop bersarang untuk mengubah suai pembolehubah dalam skop yang disertakan:
class Foo:
    x = 5

    def get_y():
        nonlocal x
        return [x for i in range(1)]

    y = get_y()
  1. Gunakan Pembolehubah Instance: Daripada menyimpan hasil pemahaman pada kelas itu sendiri, anda boleh menyimpannya pada contoh:
class Foo:
    def __init__(self):
        self.y = [self.x for i in range(1)]
  1. Gunakan Atribut Fungsi: Sama seperti menggunakan fungsi sementara, anda juga boleh menentukan atribut fungsi yang menyimpan kelas pembolehubah:
class Foo:
    x = 5

    @classmethod
    def get_y(cls):
        y = [cls.x for i in range(1)]
        return y

Foo.y = Foo.get_y()

Adalah penting untuk ambil perhatian bahawa walaupun penyelesaian ini membolehkan anda mengakses pembolehubah kelas daripada pemahaman, ia memperkenalkan kerumitan tambahan kepada kod anda. Pertimbangkan dengan teliti pendekatan mana yang paling sesuai untuk keperluan khusus anda.

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