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
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.
Terdapat beberapa penyelesaian untuk sekatan ini:
class Foo: x = 5 def get_y(self, x): return [x for i in range(1)] y = get_y(x)
class Foo: x = 5 def get_y(): nonlocal x return [x for i in range(1)] y = get_y()
class Foo: def __init__(self): self.y = [self.x for i in range(1)]
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!