Pythonのboolsは値によって渡されていますか?
-
18-09-2019 - |
質問
IはBOOLオブジェクトへの参照を送信し、私はメソッド内でそれを修正しました。この方法は、それが実行だ終わった後、法の外ブールの値は変化しなかった。
これは、Pythonのboolsが値によって渡されることを信じて私をリードしています。本当?他にどのようなPythonの種類そのように振る舞う?
解決
Pythonの変数は、C ++の意味での「参照」ではありません。むしろ、彼らは単にメモリ内のいくつかの任意の位置にあるオブジェクトにバインドされたローカル名です。そのオブジェクトが変更可能である場合には、そのことへの変更は、オブジェクトに名前をバインドしている他のスコープに表示されます。 (bool
、int
、str
、およびtuple
を含む)多くのプリミティブ型であるの不変ののが。あなたは、その場で自分の価値を変更することはできません。むしろ、あなたのローカルスコープ内で同じ名前に新しい値を代入します。
実際には、フォームのfoo = X
のコードを参照してください*ほぼすべての時間は、それは名前foo
がX
によって名付けられたメモリ内の位置を持っているではないことを、あなたの現在のローカル名前空間内の新しい値(foo
)が割り当てられていることを意味しその内部ポインタはX
の場所に代わりに参照するように更新されます。
* - 。Pythonでこの唯一の例外は、あなたがobj.foo = X
を書くために、それは代わりにobj.setFoo(X)
のようなメソッドを呼び出すためにバックグラウンドで書き換えられている可能プロパティのsetterメソッドです。
他のヒント
これは、オブジェクトが可変か不変であるかどうかに依存します。あなたはブール値で見たように変更可能なオブジェクトが変更されるのに対し、不変オブジェクトは、振る舞います。
参考: http://www.testingreflections.com/node/view/5126 >
Pythonは参照・ツー・オブジェクト(Javaのような)値によりを通過させ、Pythonではすべてが目的です。これは簡単に聞こえるが、その後、あなたは他の人が参照渡しのように動作するように見える一方で、いくつかのデータ型は、値渡し特性を示すように見えることがわかります...契約は何でしょうか。
変更可能と不変オブジェクトを理解することが重要です。いくつかのオブジェクトは、文字列、タプル、および数字のように、不変です。関数/メソッドの内部でそれらを変更すると、新しいインスタンスを作成し、関数/メソッド外の元のインスタンスは変更されませんでしょう。リストや辞書などの他の目的は、あなたがその場でオブジェクトを変更することができることを意味しており、変更可能です。したがって、関数/メソッドの内部でオブジェクトを変更することも外側元のオブジェクトを変更します。
覚えておくべき事があるからであるの機能のためのPythonでいないの方法や、呼び出し元の名前空間で名前を再バインドする方法。あなたが書くとき、「私はブールオブジェクトへの参照を送って、私はメソッドの中でそれを修正」、あなたが実際に何をしたか(私は推測しています)の内部(ブール値が呼び出しに拘束された先の)パラメータ名を再バインドすることでしたメソッド本体ます。
つまり、のパイソンには変数は存在しません。オブジェクト(TrueとFalseのように、boolsは不変であることを起こる)、および名前があります。あなたは通常ローカル名以外の名前を変更することはできません、名前はあなたが変数を呼んでいるものですが、名前がスコープに属します。