可以间接修改字典吗?

时间:2012-05-10 02:27:25

标签: python list

很抱歉提出一个愚蠢的问题,但我找不到完整的答案。

以下内容:

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上任何基于作业的操作只会重新设置参考。有没有办法以这种间接方式修改原始字典元素?

我知道其他一些方法可以通过直接引用字典来实现这一点,但我很好奇是否能以某种方式完成。

4 个答案:

答案 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_modifya_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]}