Python 3 のリスト内包表記からクラス変数に直接アクセスできないのはなぜですか?
クラス定義内のリスト内包表記からクラス変数にアクセス
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 はその内包表記の新しいスコープを作成します。この新しいスコープにはクラス スコープが含まれていないため、クラス スコープで定義された変数は内包表記内では表示されません。
内包表記、ジェネレーター式、ラムダ関数はすべて独自の独立したスコープを持っているため、これらのスコープを使用することはできません。囲んでいる関数またはクラス スコープから変数に直接アクセスします。これは、外側のスコープ内の変数が意図せず変更されることを防ぐセキュリティ対策です。
回避策
この制限にはいくつかの回避策があります。
- 一時関数を使用する: クラス変数を明示的にクラスに渡す関数をクラス内で定義できます。 comprehension:
class Foo: x = 5 def get_y(self, x): return [x for i in range(1)] y = get_y(x)
- Use Nonlocal: このキーワードは、ネストされたスコープ内の関数に、外側のスコープ内の変数を変更するように指示するために使用できます:
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)]
- 関数属性を使用します:一時関数の使用と同様に、クラスを格納する関数属性を定義することもできます。 variable:
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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

正規表現は、プログラミングにおけるパターンマッチングとテキスト操作のための強力なツールであり、さまざまなアプリケーションにわたるテキスト処理の効率を高めます。

この記事では、numpy、pandas、matplotlib、scikit-learn、tensorflow、django、flask、and requestsなどの人気のあるPythonライブラリについて説明し、科学的コンピューティング、データ分析、視覚化、機械学習、Web開発、Hの使用について説明します。

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...
