5

Pythonの不変オブジェクトは、その概念の後でその値を変更できないことを意味しますか?その場合、その値を変更しようとするとどうなりますか。

私の疑問を例を挙げて説明してみましょう。

たとえば、StringオブジェクトSを値で初期化しました"Hello World"

S = 'Hello World'

次に、行を入力しました。

S = 'Hello Human'

ですから、通訳に聞いてみると、Sの値はです"Hello Human"。明らかに今、「S」は新しい値を持っています。

値はどのように変化しましたか?Pythonは古い文字列オブジェクトを破棄し、新しい値で新しいオブジェクトを作成しましたか?または、古いオブジェクトの値を変更しただけですか。これは、文字列オブジェクトが不変であるという事実と関係がありますか?もしそうなら、可変オブジェクトはどのように動作しますか?

4

6 に答える 6

8

PythonSは古い文字列オブジェクトを指すのをやめ、新しいオブジェクトを指すようにしました

>>> S="Hello World"
>>> id(S)
32386960
>>> S="Hello Human"
>>> id(S)
32387008
>>> 

+=不変オブジェクトを変更することはできないので、(たとえば演算子を使用して)自分がそうだと思っていても、そうではありません。

>>> S="Hello"
>>> id(S)
32386912
>>> S+=" World"
>>> id(S)
32386960
>>> 
于 2012-06-10T06:58:49.680 に答える
4

したがって、次のようなことをしている場合:

>>> s = "Hello World"
>>> print s
"Hello World"
>>> old_s = s
>>> s = "Hello Human"
>>> print s
"Hello Human"
>>> print old_s
"Hello World"

Pythonの文字列は変更できないことがわかります(文字通り、文字列を変更することはできません)。

文字列(またはタプルや整数などの他の不変オブジェクト)に追加すると、オブジェクトの新しいコピーが作成され、古いオブジェクトへの参照が削除されます。(Pythonは、オブジェクトを参照しているものがなくなったときに、ガベージコレクションを処理します)。

于 2012-06-10T07:01:19.947 に答える
4

値は変化しませんでした。名前新しいオブジェクトにバインドされました。

于 2012-06-10T06:57:56.253 に答える
2
s = 'helloworld'
>>> id(s)
29779592
>>> s = 'hello'
>>> id(s)
29771680

これで、変数Sは新しいオブジェクトを参照します

于 2012-06-10T06:59:02.100 に答える
1

Pythonの不変オブジェクトは、その概念の後でその値を変更できないことを意味しますか?

はい。

その場合、その値を変更しようとするとどうなりますか。

tryを変更する手段がないため、値を変更しようとしないため、質問は無効です。

あなたが本当に求めているのは、値に名前を付ける変数に割り当てたときに何が起こるかです。

ここで「a」という単語に特に注意してください。複数の変数が同じ値に名前を付けることができます。また、「名前」という言葉ではなく、特別なものを取り上げてほしい。Python変数は確かに名前であり、値を格納しませんが、名前を提供します。

明らかに今、「S」は新しい値を持っています。

ここで、別の値にS 名前を付けます。

値はどのように変化しましたか?

そうではありませんでした。S以前の名前を付けるのをやめ、新しい値の名前を付け始めました。

Pythonは古い文字列オブジェクトを破棄しましたか

他に名前がない場合、ある可能性があります。値の名前がない場合、最終的には破棄されます。それはプログラマーとしてのあなたの関心事ではありません。

そして、新しい価値を持つ新しいものを作成しましたか?

はい。

もしそうなら、可変オブジェクトはどのように動作しますか?

同じように、名前に割り当てるとき。名前は名前であり、値は値です。(このコンテキストでは、「オブジェクト」と「値」は同じ意味です。)割り当てとは、名前に値の名前を付けるプロセスです。オブジェクトが可変であるかどうかは関係ありません。突然変異は他の方法で行われます。(たとえば、alistは実際には名前のリストであり、リストを実際に変更するのではなく、名前とその指示対象の数を変更するという議論をすることはできますが。)

于 2012-06-10T10:57:20.737 に答える
0

Pythonの変数はバインディングにすぎないため、代入演算子を使用すると、使用しているPythonのバージョンに応じて、新しいバインディングを作成するか、以前のバインディングを置き換えることになります...しかし、これは実装の詳細だと思います。心配する必要はありません。

辞書/リストなどの可変オブジェクトは、内部または外部のさまざまなメソッドを介して内部状態を変更できます。不変オブジェクトにはそのようなメソッドはなく、状態は構築中にのみ設定でき、オブジェクト自体は、パフォーマンスのためにプールされない限り破棄できます。理由..。

于 2012-06-10T08:29:01.940 に答える