質問

IはBOOLオブジェクトへの参照を送信し、私はメソッド内でそれを修正しました。この方法は、それが実行だ終わった後、法の外ブールの値は変化しなかった。

これは、Pythonのboolsが値によって渡されることを信じて私をリードしています。本当?他にどのようなPythonの種類そのように振る舞う?

役に立ちましたか?

解決

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

実際には、フォームのfoo = Xのコードを参照してください*ほぼすべての時間は、それは名前fooXによって名付けられたメモリ内の位置を持っているではないことを、あなたの現在のローカル名前空間内の新しい値(foo)が割り当てられていることを意味しその内部ポインタはXの場所に代わりに参照するように更新されます。

* - 。Pythonでこの唯一の例外は、あなたがobj.foo = Xを書くために、それは代わりにobj.setFoo(X)のようなメソッドを呼び出すためにバックグラウンドで書き換えられている可能プロパティのsetterメソッドです。

他のヒント

覚えておくべき事があるからであるの機能のためのPythonでいないの方法や、呼び出し元の名前空間で名前を再バインドする方法。あなたが書くとき、「私はブールオブジェクトへの参照を送って、私はメソッドの中でそれを修正」、あなたが実際に何をしたか(私は推測しています)の内部(ブール値が呼び出しに拘束された先の)パラメータ名を再バインドすることでしたメソッド本体ます。

つまり、のパイソンには変数は存在しません。オブジェクト(TrueとFalseのように、boolsは不変であることを起こる)、および名前があります。あなたは通常ローカル名以外の名前を変更することはできません、名前はあなたが変数を呼んでいるものですが、名前がスコープに属します。

scroll top