在 Python 2 中,可以從類別定義中的清單推導式存取類別變數。但是,在 Python 3 及更高版本中,由於範圍限制,這是不允許的。類別作用域與推導式和其他函數的作用域分開處理,因此,不允許使用名稱從推導式中存取類別變數。
例如,Python 2 中的以下程式碼可以運作:
class Foo: x = 5 y = [x for i in range(1)]
但是,在Python 3中,會導致錯誤:
NameError: name 'x' is not defined
此限制的原因是由於Python 處理範圍的方式。當評估類別定義中的清單推導式時,Python 會為此推導式建立一個新的作用域。這個新作用域不包括類別作用域,因此在類別作用域中定義的任何變數在推導式中都是不可見的。
推導式、生成器表達式和 lambda 函數都有自己的隔離作用域,這意味著它們不能直接從封閉函數或類別範圍存取變數。這是一項安全措施,可防止意外修改封閉範圍內的變數。
此限制有一些解決方法:
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()
需要注意的是,雖然這些解決方法允許您從推導式中存取類別變量,但它們確實會為您的程式碼帶來額外的複雜性。仔細考慮哪種方法最適合您的特定需求。
以上是為什麼我不能直接從 Python 3 中的列表推導式存取類別變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!