目次
デフォルトのパラメーターは、定義されたときに1回のみ評価されます
正しい方法:デフォルト値としてなしを使用してから初期化
この問題は、クラスの方法でも注意を払う必要があります
それを行う方法を要約します
ホームページ バックエンド開発 Python チュートリアル Pythonクラス可変デフォルト引数の問題

Pythonクラス可変デフォルト引数の問題

Jul 03, 2025 am 01:35 AM

デフォルトのパラメーターとして可変オブジェクトを使用すると、デフォルトのパラメーターは関数が定義されたときに1回だけ評価され、同じオブジェクトを共有する複数の呼び出しが行われるため、予期しない動作につながります。正しい方法は、デフォルト値としてなし、関数内でそれを初期化することです。このルールは、クラスメソッドの__init__にも適用できます。例:1。Add_Item(item、my_list = [])を書き込む間違った方法がリストを共有します。 2。my_list= noneを記述し、関数内の値を割り当てる正しい方法。 3.クラスの__init__メソッドは、データの書き込みを回避する必要があります。

Pythonクラス可変デフォルト引数の問題

Pythonでクラスを作成すると、多くの人がトラップに分類されます。これは、機能パラメーターのデフォルト値として変動するオブジェクトを使用し、結果の動作は予想外です。この問題はlistのようなデフォルトパラメーターなどの可変タイプやdictなどの可変タイプを使用して、関数定義で最も一般的です。

Pythonクラス可変デフォルト引数の問題
 def add_item(item、my_list = []):
    my_list.append(item)
    my_listを返します

それは大丈夫に見えますが、あなたはそれを数回続けて呼びかけようとします:

Pythonクラス可変デフォルト引数の問題
 print(add_item(1))#[1]
print(add_item(2))#[1、2]←状況は何ですか?

なぜこれが起こっているのですか?それを避ける方法は?以下は、はっきりと説明するいくつかのポイントです。


デフォルトのパラメーターは、定義されたときに1回のみ評価されます

Pythonのデフォルト機能は、呼び出されるたびに再生されるわけではなく、関数が定義されているときに作成されます。つまり、

Pythonクラス可変デフォルト引数の問題
 def func(a = []):
    ...

ここではa同じリストオブジェクトです。関数が呼び出されるたびに引数が渡されない場合、この「共有」リストで引き続き動作します。

これは実際には言語デザインの特徴ですが、ほとんどの人の直感に適合していないため、古典的な「トラップ」になりました。


正しい方法:デフォルト値としてなしを使用してから初期化

この問題を回避するために、標準的なプラクティスは、デフォルトのパラメーターをNoneに設定し、関数内の値を判断して割り当てることです。

 def add_item(item、my_list = none):
    my_listがなしである場合:
        my_list = []
    my_list.append(item)
    my_listを返します

このようにして、新しい空のリストが呼び出されるたびに作成され、互いに干渉しません。

ヒント:この執筆方法は、 listだけでなく、 dictsetなどの他の変数タイプにも適用されます。


この問題は、クラスの方法でも注意を払う必要があります

通常の機能だけでなく、クラスの方法でエラーも発生する場合があります。例えば:

クラスmyclass:
    def __init __(self、data = []):
        self.data = data

dataが渡されない2つのインスタンスがある場合、彼らのself.data実際に同じリストを指します。

 a = myclass()
b = myclass()
a.data.append(1)
印刷(b.data)#[1]←何かがうまくいかなかった

ソリューションは依然として同じルーチンです。

クラスmyclass:
    def __init __(self、data = none):
        データがない場合:
            data = []
        self.data = data

それを行う方法を要約します

  • デフォルトのパラメーターとしてlistdict 、その他の変数オブジェクトを使用しないでください
  • Noneで交換してから、関数本文に初期値を割り当てます
  • これは、クラスの__init__メソッドに注意することも重要です。
  • 他の人によって書かれたコードにこの問題があるかどうかわからない場合は、デフォルトのパラメーターを確認するのが最善です

基本的にそれだけです。複雑ではありませんが、無視するのは簡単です。

以上がPythonクラス可変デフォルト引数の問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

ホットトピック

完成したPython Blockbuster Online Viewing Entrant Python無料完成ウェブサイトコレクション 完成したPython Blockbuster Online Viewing Entrant Python無料完成ウェブサイトコレクション Jul 23, 2025 pm 12:36 PM

この記事では、いくつかのトップPython「完成した」プロジェクトWebサイトと、高レベルの「大ヒット作「学習リソースポータル」が選択されています。開発のインスピレーション、観察、学習のマスターレベルのソースコードを探している場合でも、実用的な機能を体系的に改善している場合でも、これらのプラットフォームは見逃せず、Pythonマスターに迅速に成長するのに役立ちます。

量子機械学習用のPython 量子機械学習用のPython Jul 21, 2025 am 02:48 AM

Quantum Machine Learning(QML)を開始するには、優先ツールがPythonであり、Pennylane、Qiskit、Tensorflowquantum、Pytorchquantumなどのライブラリをインストールする必要があります。次に、Pennylaneを使用して量子ニューラルネットワークを構築するなど、例を実行してプロセスに慣れます。次に、データセットの準備、データエンコード、パラメトリック量子回路の構築、古典的なオプティマイザートレーニングなどの手順に従ってモデルを実装します。実際の戦闘では、最初から複雑なモデルを追求したり、ハードウェアの制限に注意を払ったり、ハイブリッドモデル構造を採用したり、開発をフォローアップするための最新のドキュメントと公式文書を継続的に参照することを避ける必要があります。

Python Run Shellコマンドの例 Python Run Shellコマンドの例 Jul 26, 2025 am 07:50 AM

subprocess.run()を使用して、シェルコマンドを安全に実行し、出力をキャプチャします。注入リスクを避けるために、リストのパラメーターを渡すことをお勧めします。 2。シェル特性が必要な場合は、シェル= trueを設定できますが、コマンドインジェクションに注意してください。 3. subprocess.popenを使用して、リアルタイム出力処理を実現します。 4。Check = COMMATが失敗したときに例外をスローするためにtrueを設定します。 5.単純なシナリオで直接チェーンを呼び出して出力を取得できます。 os.system()または非推奨モジュールの使用を避けるために、日常生活の中でsubprocess.run()を優先する必要があります。上記の方法は、Pythonでシェルコマンドを実行するコアの使用を上書きします。

Python Seabornジョイントプロットの例 Python Seabornジョイントプロットの例 Jul 26, 2025 am 08:11 AM

Seabornのジョイントプロットを使用して、2つの変数間の関係と分布をすばやく視覚化します。 2。基本的な散布図は、sns.jointplot(data = tips、x = "total_bill"、y = "tip"、dind = "scatter")によって実装され、中心は散布図であり、ヒストグラムは上部と右側と右側に表示されます。 3.回帰線と密度情報をdind = "reg"に追加し、marminal_kwsを組み合わせてエッジプロットスタイルを設定します。 4。データ量が大きい場合は、「ヘックス」を使用することをお勧めします。

Python Webスクレイピングチュートリアル Python Webスクレイピングチュートリアル Jul 21, 2025 am 02:39 AM

Python Web Crawlersをマスターするには、3つのコアステップを把握する必要があります。1。リクエストを使用してリクエストを開始し、メソッドを取得してWebページのコンテンツを取得し、ヘッダーの設定に注意を払い、例外を処理し、robots.txtを遵守します。 2。美しいソープまたはXPathを使用してデータを抽出します。前者は単純な解析に適していますが、後者はより柔軟で複雑な構造に適しています。 3.セレンを使用して、動的読み込みコンテンツのブラウザ操作をシミュレートします。速度は遅いですが、複雑なページに対処できます。また、効率を向上させるために、WebサイトAPIインターフェイスを見つけることもできます。

パイソンリストへの変換の例 パイソンリストへの変換の例 Jul 26, 2025 am 08:00 AM

文字列リストは、 '' .join(words)などのJoIn()メソッドとマージして、「Helloworldfrompython」を取得できます。 2。NUMBERリストは、参加する前にMAP(STR、数字)または[STR(x)forxinNumbers]を備えた文字列に変換する必要があります。 3.任意のタイプリストは、デバッグに適したブラケットと引用符のある文字列に直接変換できます。 4。カスタム形式は、 '|' .join(f "[{item}]" foriteminitems)output "[a] | [などのjoin()と組み合わせたジェネレーター式によって実装できます。

PythonはSQL Server Pyodbcの例に接続します PythonはSQL Server Pyodbcの例に接続します Jul 30, 2025 am 02:53 AM

Pyodbcのインストール:Pipinstallpyodbcコマンドを使用してライブラリをインストールします。 2.接続sqlserver:pyodbc.connect()メソッドを介して、ドライバー、サーバー、データベース、uid/pwdまたはtrusted_connectionを含む接続文字列を使用し、それぞれSQL認証またはWindows認証をサポートします。 3.インストールされているドライバーを確認します:pyodbc.drivers()を実行し、「sqlserver」を含むドライバー名をフィルタリングして、「sqlserverのodbcdriver17」などの正しいドライバー名が使用されるようにします。 4.接続文字列の重要なパラメーター

python httpx asyncクライアントの例 python httpx asyncクライアントの例 Jul 29, 2025 am 01:08 AM

httpx.asyncclientを使用して、非同期httpリクエストを効率的に開始します。 1.基本的なGETリクエストは、asyncwithを介してクライアントを管理し、awaitclient.getを使用して非ブロッキングリクエストを開始します。 2。asyncio.gatherを組み合わせてasyncio.gatherを組み合わせると、パフォーマンスが大幅に向上する可能性があり、合計時間は最も遅いリクエストに等しくなります。 3.カスタムヘッダー、認証、base_url、タイムアウト設定をサポートします。 4。投稿リクエストを送信してJSONデータを伝達できます。 5.同期非同期コードの混合を避けるために注意してください。プロキシサポートは、クローラーやAPI集約、その他のシナリオに適したバックエンド互換性に注意を払う必要があります。

See all articles