首頁 > 後端開發 > Python教學 > 為什麼我無法在類別定義中的 Python 3 列表推導式中直接存取類別變數?

為什麼我無法在類別定義中的 Python 3 列表推導式中直接存取類別變數?

Susan Sarandon
發布: 2024-12-27 13:59:14
原創
992 人瀏覽過

Why Can't I Access Class Variables Directly in Python 3 List Comprehensions Within a Class Definition?

從類別定義中的列表推導式存取類別變數

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板