オブジェクトと変数を区別する必要があります。Python では、オブジェクトは、そのデータのメモリ表現と、その上で呼び出すことができるメソッドのテーブルを持つ「物理的な」エンティティです。一方、変数は単にオブジェクトへの参照であり、それ自体の物理的なアイデンティティはありません (たとえば、C とは異なり、ポインターは依然としてオブジェクトとは無関係にアドレスを取得できるものです)に指差す)。
それでは、投稿したコードを見てみましょう。あなたが言う時
a_dict = {"A":0, "B":0}
a_dict
2 つのキーと値のペアに配置された他の 4 つのオブジェクトへの参照を含むディクショナリ オブジェクト があります。
あなたが言う時
def GetElementRef(index):
return a_dict[index]
would_like_to_modify = GetElementRef("A")
現在would_like_to_modify
、両方の値スロットの 1 つがa_dict
同じオブジェクトを参照しています (数値が実際にはオブジェクトではないことは今のところ無視してください)。しかし、あなたが言うとき
would_like_to_modify = 2
変数が指す値を変更するのではなく、変数を別のオブジェクトに再バインドしています。would_like_to_modify
基本的に、変数が右辺値として使用される場合、変数はそれが参照するオブジェクトに透過的に置き換えられますが、左辺値として使用される場合は、= の右側のオブジェクトにバインドされます。同様に、 a_dict["A"] は参照であり、左辺値として使用される場合は別のオブジェクトに再バインドできますが、右辺値として使用される場合は参照する値に透過的に置き換えられます。経由でアクセスしたという事実a_dict["A"]
は失われます。
重要な点は=
、オブジェクトへの参照をバインドするという厳密に 1 つのことを行う演算子であるということです。上記の Óscar López が投稿したコードを見ると、次のようになります。
a_dict = {"A":[0], "B":[0]}
そして少し書き直します
num1 = 0
key1 = "A"
value1 = [num1]
num2 = 0
key2 = "B"
value2 = [num2]
a_dict = {key1 : value1, key2 : value2}
関連する 7 つのオブジェクト、不変の 2 つの整数、2 つの文字列、それぞれ 1 つの整数への参照を持つ 2 つの配列、キー スロット内の 2 つの文字列への参照、およびその値内の 2 つの配列への参照を持つ dict があることがわかります。スロット。次の対話型セッションは有益です。
In [1]: num1 = 0
In [2]: key1 = "A"
In [3]: val1 = [num1]
In [4]: num2 = 1
In [5]: key2 = "B"
In [6]: val2 = [num2]
In [7]: dict = {key1: val1, key2: val2}
In [8]: dict
Out[8]: {'A': [0], 'B': [1]}
In [9]: num1 = 4
In [10]: val1
Out[10]: [0]
In [11]: dict
Out[11]: {'A': [0], 'B': [1]}
In [12]: val1 = [6]
In [13]: dict
Out[13]: {'A': [0], 'B': [1]}
In [14]: val2[0] = 42
In [15]: val2
Out[15]: [42]
In [16]: dict
Out[16]: {'A': [0], 'B': [42]}