このクラスはテスト用に書きました:
リーリーインスタンスを作成しようとすると、出力は original
になります。したがって、Pythonのパラメータは値によって渡されるようです。そうですか?出力が changed
になるように、コードを変更して参照渡しの効果を実現するにはどうすればよいですか?
時々、x = 1
(x
はパラメータ名) のようなコードが呼び出し元のパラメータに影響を与えないことに驚く人がいますが、 のようなコードは次のようなコードです。 x[0] = 1
は呼び出し元のパラメータに影響します。これは、=
構文にもかかわらず、item assign と slice assign が 既存のオブジェクトを変更するメソッドである一方で、変数を再割り当てしないため発生します。 「なぜ関数は呼び出し元が認識する一部のパラメーターを変更できるのに、他のパラメーターは変更できないのですか?」を参照してください。もっと詳しく知る。
「参照渡しと値渡しの違いは何ですか?」も参照してください。言語に依存しない重要な用語の議論に使用します。
代入によって渡されます。これには 2 つの理由があります:
これをより明確に説明するために、いくつかの例を挙げてみましょう。
リーリー 出力: リーリー
渡されるパラメータはouter_list
への参照であり、そのコピーではないため、mutate list メソッドを使用してパラメータを変更し、その変更を外側のスコープに反映させることができます。
ここで、パラメータとして渡された参照を変更しようとすると何が起こるかを見てみましょう:
リーリー 出力: リーリー
#the_listパラメーターは値によって渡されるため、これに新しいリストを割り当てても、メソッドの外部のコードには影響しません。
the_list は outer_list
参照のコピーです。the_list
は新しいリストを指していますが、outer_list## の場所を変更する方法はありません。 # に指差す。
文字列 - 不変型
これは不変なので、文字列の内容を変更することはできません
さあ、参照を変更してみましょう リーリー
出力:リーリー 同様に、the_string
パラメータは値によって渡されるため、これに新しい文字列を割り当てても、メソッドの外部のコードに目に見える影響はありません。the_string
はouter_string 参照のコピーです。
the_string は新しい文字列を指していますが、場所
outer_string# を変更する方法はありません。 ## に指差す。
これで状況がより明確になることを願っています。
編集:
これは、@david が提起した元の質問「実際の参照によって変数を渡すためにできることはありますか?」に対する答えになっていないと誰かが指摘しました。頑張っていきましょう。
この問題をどうやって解決すればよいでしょうか?
@andrea の答えが示すように、新しい値を返すことができます。これによってコンテンツの受け渡し方法は変わりませんが、必要な情報を取得できるようになります: リーリー 戻り値の使用を本当に避けたい場合は、値を保持するクラスを作成してそれを関数に渡すか、リストなどの既存のクラスを使用できます。 リーリー
ちょっと面倒な気もしますが。以上が変数を参照渡しするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。