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
Lepaskan: 2024-12-18 09:09:10
asal
158 orang telah melayarinya

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)]
Salin selepas log masuk

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

NameError: name 'x' is not defined
Salin selepas log masuk

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)
Salin selepas log masuk
  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()
Salin selepas log masuk
  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)]
Salin selepas log masuk
  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()
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan