您需要区分对象和变量。在 python 中,对象是一个“物理”实体,具有其数据的内存表示和可以在其上调用的方法表。另一方面,变量只是对对象的引用,并且没有它自己的物理标识(不像,比如说,C,指针仍然是一个东西,你可以独立于它的对象获取地址指着)。
现在让我们看看您发布的代码。当你说
a_dict = {"A":0, "B":0}
您有一个字典对象 ,a_dict
其中包含对其他四个对象的引用,这些对象排列在两个键值对中。
当你说
def GetElementRef(index):
return a_dict[index]
would_like_to_modify = GetElementRef("A")
nowwould_like_to_modify
和两者的其中一个值槽a_dict
引用同一个对象(暂时忽略一个数字不是真正的对象)。然而,当你说
would_like_to_modify = 2
您正在将变量重新绑定would_like_to_modify
到不同的对象,而不是修改它指向的值。
基本上,当变量用作右值时,它会被它所引用的对象透明地替换,而当它用作左值时,它会绑定到 = 右侧的对象。类似地,a_dict["A"] 是一个引用,当它用作左值时,您可以将它重新绑定到不同的对象,但是当它用作右值时,它会透明地被它所引用的值替换,并且您通过它访问它的事实a_dict["A"]
已经丢失。
关键是它=
是一个严格地做一件事的操作符——它将一个引用绑定到一个对象。现在,如果您查看上面发布的 Ó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}
您可以看到涉及七个对象,两个整数,它们是不可变的,两个字符串,两个数组,每个数组都引用一个整数,一个字典,在其键槽中引用两个字符串,在其值中引用两个数组插槽。以下交互式会话具有指导意义:
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]}