10

bool オブジェクトへの参照を送信し、メソッド内でそれを変更しました。メソッドの実行が終了した後、メソッドの外側の bool の値は変更されませんでした。

これにより、Python の bool は値渡しであると思われます。本当?そのように動作する他の Python 型は?

4

4 に答える 4

13

Python 変数は、C++ の意味での「参照」ではありません。むしろ、メモリ内の任意の場所にあるオブジェクトにバインドされた単なるローカル名です。そのオブジェクト自体が変更可能である場合、そのオブジェクトへの変更は、名前をオブジェクトにバインドしている他のスコープで表示されます。ただし、多くのプリミティブ型 ( boolintstr、およびを含むtuple) は不変です。それらの値をその場で変更することはできません。代わりに、ローカル スコープ内の同じ名前に新しい値を割り当てます。

実際、ほとんどの場合* という形式のコードが表示されますが、これは、現在のローカル名前空間内でその名前に新しい値 ( ) が割り当てられているfoo = Xことを意味します。名前が付けられたメモリ内の場所が、代わりに参照するように更新された内部ポインターを持っていることを意味します。の場所へ。fooXfooX

*- Python でのこれに対する唯一の例外は、プロパティのセッター メソッドです。これにより、obj.foo = X代わりに のようなメソッドを呼び出すために、バックグラウンドで書き込みおよび書き換えることができる場合がありますobj.setFoo(X)

于 2009-09-29T20:23:48.177 に答える
1

オブジェクトが変更可能か不変かによって異なります。不変オブジェクトは bool で見たように動作しますが、可変オブジェクトは変更されます。

参考:http ://www.testingreflections.com/node/view/5126

Python はオブジェクトへの参照を (Java のように) 値で渡し、Python のすべてはオブジェクトです。これは単純に聞こえますが、一部のデータ型は値渡しの特性を示しているように見え、他のデータ型は参照渡しのように動作しているように見えることに気付くでしょう...どうしたのでしょう?

可変オブジェクトと不変オブジェクトを理解することが重要です。文字列、タプル、数値などの一部のオブジェクトは不変です。関数/メソッド内でそれらを変更すると、新しいインスタンスが作成され、関数/メソッド外の元のインスタンスは変更されません。リストや辞書などの他のオブジェクトは変更可能です。つまり、オブジェクトをその場で変更できます。したがって、関数/メソッド内のオブジェクトを変更すると、元のオブジェクトも変更されます。

于 2009-09-29T20:22:06.887 に答える
1

覚えておくべきことは、Python では、関数またはメソッドが呼び出し元の名前空間で名前を再バインドする方法がないということです。「boolオブジェクトへの参照を送信し、メソッド内で変更しました」と書いた場合、実際に行ったこと(推測では)は、パラメーター名(呼び出しによってbool値がバインドされた)を内部で再バインドすることでしたメソッド本体。

于 2009-09-30T02:51:58.350 に答える
0

要するに、Python には変数がありません。オブジェクト (True と False のように、bool はたまたま不変です) と名前があります。名前は変数と呼ばれるものですが、名前はスコープに属します。通常、ローカル名以外の名前を変更することはできません。

于 2009-09-29T20:24:08.323 に答える