ホームページ  >  記事  >  バックエンド開発  >  変数を参照渡しするにはどうすればよいですか?

変数を参照渡しするにはどうすればよいですか?

PHPz
PHPz転載
2024-02-09 20:00:05592ブラウズ

変数を参照渡しするにはどうすればよいですか?

質問の内容

このクラスはテスト用に書きました:

リーリー

インスタンスを作成しようとすると、出力は original になります。したがって、Pythonのパラメータは値によって渡されるようです。そうですか?出力が changed になるように、コードを変更して参照渡しの効果を実現するにはどうすればよいですか?

時々、x = 1 (x はパラメータ名) のようなコードが呼び出し元のパラメータに影響を与えないことに驚く人がいますが、 のようなコードは次のようなコードです。 x[0] = 1 は呼び出し元のパラメータに影響します。これは、= 構文にもかかわらず、item assignslice assign 既存のオブジェクトを変更するメソッドである一方で、変数を再割り当てしないため発生します。 「なぜ関数は呼び出し元が認識する一部のパラメーターを変更できるのに、他のパラメーターは変更できないのですか?」を参照してください。もっと詳しく知る。

「参照渡しと値渡しの違いは何ですか?」も参照してください。言語に依存しない重要な用語の議論に使用します。


正解


パラメータは

代入によって渡されます。これには 2 つの理由があります:

    渡されるパラメータは、実際にはオブジェクトへの
  1. 参照です (ただし、参照は値によって渡されます)
  2. 一部のデータ型は変更可能ですが、その他のデータ型は変更できません
  3. ###それで:###

    可変
  • オブジェクトをメソッドに渡すと、メソッドは同じオブジェクトへの参照を取得し、それを自由に変更できますが、メソッド それについて何も知らないまま、完了しても、外部参照は元のオブジェクトを指したままになります。

  • immutable
  • オブジェクトをメソッドに渡しても、外部参照を再バインドしたり、オブジェクトを変更したりすることはできません。

    これをより明確に説明するために、いくつかの例を挙げてみましょう。
リスト - 可変型

メソッドに渡されるリストを変更してみましょう:

リーリー 出力: リーリー

渡されるパラメータは

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 サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。