很抱歉提出一个愚蠢的问题,但我找不到完整的答案。
以下内容:
a_dict = {"A":0, "B":0}
def GetElementRef(index):
return a_dict[index]
would_like_to_modify = GetElementRef("A")
would_like_to_modify = 2
这会导致would_like_to_modify
的值为2,而a_dict
保持不变。
AFAIK,would_like_to_modify
上任何基于作业的操作只会重新设置参考。有没有办法以这种间接方式修改原始字典元素?
我知道其他一些方法可以通过直接引用字典来实现这一点,但我很好奇是否能以某种方式完成。
答案 0 :(得分:4)
对于问题中的代码,答案是“否”,因为字典中的值是数字,而数字是不可变的。另一方面,如果值是可变的,它们确实可以改变。例如:
a_dict = {"A":[0], "B":[0]}
def GetElementRef(index):
return a_dict[index]
would_like_to_modify = GetElementRef("A")
print would_like_to_modify
> [0]
would_like_to_modify[0] = 2
print would_like_to_modify
> [2]
答案 1 :(得分:0)
如果没有对该对象的引用,则无法更改对象。您没有对要修改的对象(字典)的引用,因此您的问题的答案是否定的。
您可以在字典中修改对象,只要它是一个可变类型(例如,如果字典项是列表,您可以更改它),但字典本身不能修改。
答案 2 :(得分:0)
为什么不使用a_dict [index] =“something”的标准方法?
答案 3 :(得分:0)
您需要区分对象和变量。在python中,对象是一个“物理”实体,它有一个数据的内存表示,以及一个可以在其上调用的方法表。另一方面,变量只是对对象的引用,并且没有自己的物理身份(不像C,其中指针仍然是一个可以独立于对象的地址的东西)指向)。
现在让我们看看你发布的代码。当你说
a_dict = {"A":0, "B":0}
你有一个字典对象a_dict
,它包含对其他四个对象的引用,这些对象按两个键值对排列。
当你说
时def GetElementRef(index):
return a_dict[index]
would_like_to_modify = GetElementRef("A")
现在would_like_to_modify
和a_dict
的一个值槽都引用同一个对象(忽略一个数字不是真正的对象)。但是,当你说
would_like_to_modify = 2
您将变量would_like_to_modify
重新绑定到另一个对象,而不是修改它指向的值。
基本上,当一个变量用作右值时,它会被它引用的对象透明地替换,而当它被用作左值时,它被绑定到=右边的对象。类似地,a_dict [“A”]是一个引用,当它用作左值时,你可以将它重新绑定到另一个对象,但是当它被用作右值时,它会被它引用的值透明地替换,并且您通过a_dict["A"]
访问它的事实已丢失。
关键点在于=
是一个严格执行一项操作的运算符 - 它绑定对象的引用。现在,如果你看一下上面发布的代码ÓscarLó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}
你可以看到涉及七个对象,两个整数,它们是不可变的,两个字符串,两个数组,每个数组都引用一个整数,一个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]}