ホームページ >バックエンド開発 >Python チュートリアル >クラス定義内の Python 3 リスト内包表記でクラス変数に直接アクセスできないのはなぜですか?
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 サイトの他の関連記事を参照してください。