在Python 3 中,列表推導式無法直接存取類別定義中定義的類別變量,因為它們在自己的嵌套範圍內操作。此行為與 Python 2 不同,在 Python 2 中可以進行此類存取。
以下程式碼示範了 Python 3 中的問題:
class Foo: x = 5 y = [x for i in range(1)]
此程式碼將引發x 的 NameError,因為清單推導式無法存取類別變數。
列表推導式、集合推導式和字典推導式以及生成器表達式在不繼承自類作用域的嵌套作用域中運行。這是因為此類推導式是作為函數實現的,並在單獨的作用域中運行。
儘管有限制,但還是有一些解決方法可以從推導式存取類別變數:
在類別定義中建立特定作用域來保存推導式所需的變數:
class Foo: x = 5 def __init__(self): y = [self.x for i in range(1)]
使用實例變量,透過在建構函式中初始化它們:
class Foo: def __init__(self): self.x = 5 self.y = [self.x for i in range(1)]
如果可能,將變數和邏輯移到類別定義之外並使用全域作用域:
x = 5 class Foo: y = [x for i in range(1)]
直接訪問類別變數時在理解中是不可能的,最外面的可迭代有一個例外。決定最外層可迭代的表達式可以存取類別變數:
class Foo: x = 5 y = [i for i in range(x)]
以上是為什麼 Python 3 列表推導式不能直接存取類別變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!