Python 2 では、クラス定義内のリスト内包表記からクラス変数にアクセスできました。ただし、Python 3 以降では、スコープ制限により、これは許可されません。クラス スコープは内包表記や他の関数のスコープとは別に扱われるため、名前を使用して内包表記内からクラス変数にアクセスすることは許可されません。
たとえば、Python 2 の次のコードは機能します。 :
class Foo: x = 5 y = [x for i in range(1)]
ただし、Python 3 では、次のようになります。 error:
NameError: name 'x' is not defined
この制限の理由は、Python によるスコープの処理方法にあります。クラス定義内のリスト内包表記を評価する場合、Python はその内包表記の新しいスコープを作成します。この新しいスコープにはクラス スコープが含まれていないため、クラス スコープで定義された変数は内包表記内では表示されません。
内包表記、ジェネレーター式、ラムダ関数はすべて独自の独立したスコープを持っているため、これらのスコープを使用することはできません。囲んでいる関数またはクラス スコープから変数に直接アクセスします。これは、外側のスコープ内の変数が意図せず変更されることを防ぐセキュリティ対策です。
この制限にはいくつかの回避策があります。
class Foo: x = 5 def get_y(self, x): return [x for i in range(1)] y = get_y(x)
class Foo: x = 5 def get_y(): nonlocal x return [x for i in range(1)] y = get_y()
class Foo: def __init__(self): self.y = [self.x for i in range(1)]
class Foo: x = 5 @classmethod def get_y(cls): y = [cls.x for i in range(1)] return y Foo.y = Foo.get_y()
これらの回避策を使用すると、内包表記からクラス変数にアクセスできますが、コードがさらに複雑になることに注意することが重要です。特定のニーズにどのアプローチが最適であるかを慎重に検討してください。
以上がPython 3 のリスト内包表記からクラス変数に直接アクセスできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。