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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-23 22:51:10859ブラウズ

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

リスト内包表記からのクラス変数へのアクセス

Python 3 では、リスト内包表記は独自のネストされたスコープ内で動作するため、クラス定義内で定義されたクラス変数に直接アクセスできません。この動作は、このようなアクセスが可能だった 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)]

例外: 最も外側の Iterable

クラス変数に直接アクセスするとき内包表記では不可能です。最も外側の反復可能オブジェクトには例外があります。最も外側の反復可能を決定する式は、クラス変数にアクセスできます:

class Foo:
    x = 5
    y = [i for i in range(x)]

以上がPython 3 のリスト内包表記がクラス変数に直接アクセスできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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