ホームページ >バックエンド開発 >Python チュートリアル >Python 3 のリスト内包表記がクラス変数に直接アクセスできないのはなぜですか?
Python 3 では、リスト内包表記は独自のネストされたスコープ内で動作するため、クラス定義内で定義されたクラス変数に直接アクセスできません。この動作は、このようなアクセスが可能だった 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 中国語 Web サイトの他の関連記事を参照してください。