1

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

具有以下内容:

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

4 回答 4

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]
于 2012-05-10T02:37:04.560 回答
0

如果没有对该对象的引用,则无法更改该对象。您没有对要修改的对象(字典)的引用,因此您的问题的答案是否定的。

您可以修改字典中的对象,只要它是可变类型(例如,如果字典项是列表,则可以更改它),但不能修改字典本身。

于 2012-05-10T02:33:30.907 回答
0

为什么不使用 a_dict[index] = "something" 的标准方法呢?

于 2012-05-10T02:39:49.927 回答
0

您需要区分对象和变量。在 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]}
于 2012-05-10T03:06:28.890 回答