在Python 3 中,由於作用域的原因,不允許從類別定義中的清單推導式存取類別變數限制。類別範圍不被視為清單理解中使用的變數的有效查找範圍。
class Foo: x = 5 y = [x for i in range(1)]
此程式碼將引發 NameError: name 'x' is not Defined在 Python 3 中。
Python 遵循嚴格的作用域規則,且類作用域與函數、迴圈和推導式的作用域是分開的。推導式始終在其自己的作用域內執行,其中包括推導式本身內聲明的任何變數。
在 Python 2 中,這不是問題,因為列表推導式是使用允許存取封閉類別作用域的捷徑實現的。然而,這種行為被認為是不一致的,並在 Python 3 中進行了更改以強制執行適當的範圍。
雖然列表推導式的最內層可迭代無法存取類別變量,最外面的可迭代表達式可以。這是因為最外面的可迭代物件是在周圍範圍內求值的:
class Foo: x = 5 y = [i for i in range(x)] # This works fine
顯式函數:
在可以存取類別變數並使用列表的類別理解:
class Foo: x = 5 def get_y(self): return self.x, [x for i in range(self.x)]
實例變量:
使用列表理解在構造函數中初始化實例變量:
class Foo: def __init__(self): self.y = [self.x for i in range(1)]
全局變量:
宣告變數在類別之外並在列表理解中使用它:
x = 5 class Foo: y = [x for i in range(1)]
以上是為什麼我無法在類別定義中的 Python 3 列表推導式中直接存取類別變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!