0

私の質問は、厳密なプログラミングの質問というよりは理解に関する質問です。つまり、実際には値を格納するのではなく、その値が格納されているメモリ内の場所を指します。私が理解できないのは、次の2つのケースがどのように異なるかです:

>>> a = 3
>>> b = a
>>> a
3
>>> b
3
>>>b = 4
>>> b
4
>>> a
3

「b」に割り当てられた新しい値は、「a」が指す値を変更しません。反対に:

>>> a = [1,2,3]
>>> b = a
>>> a
[1,2,3]
>>> b
[1,2,3]
>>> b.append(4)
>>> b
[1,2,3,4]
>>> a
[1,2,3,4]

b に割り当てられた新しい値により、a が指す値が変更されました

4

3 に答える 3

3

呼び出しは新しいリストb.appendに割り当てられません。bそれはまだメモリ内の同じ位置を指しています。

>>> b = [1,2,3]
>>> id(b)
36586568L
>>> b.append(4)
>>> id(b)
36586568L

変更されるのは基礎となるデータであるため、そのデータを指している他の識別子も影響を受けます。

于 2013-07-19T14:22:14.067 に答える
0

これは、これまで何度も取り上げてきました。簡単な答えは、それらは厳密にはポインターではないということです。それらはラベルに似ています。あなたの一番上のケースでは、 b は 4 に再ラベル付けされているため、変更されています。あなたの一番下のケース(配列を使用)では、 b は再ラベル付けされていませんが、その内容だけが追加されています。そのため、配列の動作が異なるように見えます。

于 2013-07-19T14:22:20.210 に答える
0

Python の「変数」(「バインディング」の方が適切な用語) はポインターではなく、名前空間内のキーと値のペアです。名前空間とルックアップがどのように実装されるかは実装の詳細ですが、ハッシュ テーブル (Python のdict) と見なすことができます。

b に割り当てられた新しい値により、a が指す値が変更されました

の代入演算子はどこにありますb.append(4)か? あなたは rebindingbではなく、それを変異させています。名前aとの両方にバインドされているのは、依然として同じリスト オブジェクトですb

于 2013-07-19T14:25:32.920 に答える