ホームページ >バックエンド開発 >Python チュートリアル >クラス定義内の Python 3 リスト内包表記でクラス変数に直接アクセスできないのはなぜですか?

クラス定義内の Python 3 リスト内包表記でクラス変数に直接アクセスできないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-27 13:59:14994ブラウズ

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 が発生します: 名前 'x' が定義されていません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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。