首頁 > 後端開發 > Python教學 > 為什麼 Python 3 列表推導式不能直接存取類別變數?

為什麼 Python 3 列表推導式不能直接存取類別變數?

Linda Hamilton
發布: 2024-12-23 22:51:10
原創
850 人瀏覽過

Why Can't Python 3 List Comprehensions Directly Access Class Variables?

從列表推導式存取類別變數

在Python 3 中,列表推導式無法直接存取類別定義中定義的類別變量,因為它們在自己的嵌套範圍內操作。此行為與 Python 2 不同,在 Python 2 中可以進行此類存取。

錯誤範例

以下程式碼示範了 Python 3 中的問題:

class Foo:
    x = 5
    y = [x for i in range(1)]
登入後複製

此程式碼將引發x 的 NameError,因為清單推導式無法存取類別變數。

類別作用域和List/Set/Dict推導式

列表推導式、集合推導式和字典推導式以及生成器表達式在不繼承自類作用域的嵌套作用域中運行。這是因為此類推導式是作為函數實現的,並在單獨的作用域中運行。

解決方法

儘管有限制,但還是有一些解決方法可以從推導式存取類別變數:

1 。明確作用域

在類別定義中建立特定作用域來保存推導式所需的變數:

class Foo:
    x = 5
    def __init__(self):
        y = [self.x for i in range(1)]
登入後複製

2.實例變數

使用實例變量,透過在建構函式中初始化它們:

class Foo:
    def __init__(self):
        self.x = 5
        self.y = [self.x for i in range(1)]
登入後複製

3.全域作用域

如果可能,將變數和邏輯移到類別定義之外並使用全域作用域:

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

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